代码随想录——动态规划、股票问题

news/2025/1/23 9:40:24/文章来源:https://www.cnblogs.com/neromegumi/p/18687131

image
https://www.programmercarl.com/动态规划-股票问题总结篇.html#买卖股票的最佳时机含手续费

只能买一次

不断更新最小买入值,不断更新profit=prices[i]-buy

可以买卖多次

动态规划

- 定义dp数组
dp[i][1],dp[i][0]分别表示第i天持有股票时的现金和第i天未持有股票时的现金
- 递推公式
dp[i][1] = max(dp[i-1][1],dp[i-1][0]-prices[i]);
dp[i][0] = max(dp[i-1][0],dp[i-1][1]+prices[i]);
要么延续前一天相同状态,要么买/卖当前股票
- 初始化
dp[i]需要dp[i-1],因此初始化dp[0]。
dp[0][0]表示第0天没有股票的现金——0
dp[0][1]表示第0天持有股票的现金——为计算正确令为-prices[0]
- 遍历顺序
从前往后遍历

最多买卖两次

动态规划

一天一共就有五个状态,

  • 没有操作
  • 第一次买入
  • 第一次卖出
  • 第二次买入
  • 第二次卖出
    dp[i][j]中 i表示第i天,j为 [0 - 4] 五个状态,dp[i][j]表示第i天状态j所剩最大现金。

代码

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(5,0));//dp[i][j],i是第i天,j从0-4表示四种状态下持有的现金dp[0][0] = 0;//0还没有买过dp[0][1] = -prices[0];//1第一次买入股票状态dp[0][2] = 0;//2第一次卖掉股票状态dp[0][3] = -prices[0];//3第二次买入股票状态dp[0][4] = 0;//第二次卖出for(int i=1;i<n;i++){dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);dp[i][2] = max(dp[i-1][2],dp[i-1][1] + prices[i]);dp[i][3] = max(dp[i-1][3],dp[i-1][2] - prices[i]);dp[i][4] = max(dp[i-1][4],dp[i-1][3] + prices[i]);}// 利润最大一定是卖出股票的状态。而dp[i][4]可以=dp[i][2]所以返回4return dp[n-1][4];}
};

最多买卖k次

动态规划

规律:除了0以外,偶数就是卖出,奇数就是买入。
题目要求是至多有K笔交易,那么j的范围就定义为 2 * k + 1 就可以了。

  • 所以二维dp数组的C++定义为:
    vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
  • 初始化
    在初始化的地方同样要类比j为偶数是卖、奇数是买的状态。

买卖多次,卖出有一天冷冻期

动态规划

具体可以区分出如下四个状态:

  • 状态一今天持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有)
  • 不持有股票状态,这里就有两种卖出股票状态
    • 状态二今天保持卖出股票的状态(两天前就卖出了股票,度过一天冷冻期。或者是前一天就是卖出股票状态,一直没操作)
    • 状态三今天卖出股票
  • 状态四今天为冷冻期状态,但冷冻期状态不可持续,只有一天!
    image

「今天卖出股票」我是没有单独列出一个状态的归类为「不持有股票的状态」,而本题为什么要单独列出「今天卖出股票」 一个状态呢?

因为本题我们有冷冻期,而冷冻期的前一天,只能是 「今天卖出股票」状态,如果是 「不持有股票状态」那么就很模糊,因为不一定是 卖出股票的操作。

初始化

dp数组如何初始化
这里主要讨论一下第0天如何初始化。

如果是持有股票状态(状态一)那么:dp[0][0] = -prices[0],一定是当天买入股票。

保持卖出股票状态(状态二),这里其实从 「状态二」的定义来说 ,很难明确应该初始多少,这种情况我们就看递推公式需要我们给他初始成什么数值。

如果i为1,第1天买入股票,那么递归公式中需要计算 dp[i - 1][1] - prices[i] ,即 dp[0][1] - prices[1],那么大家感受一下 dp[0][1] (即第0天的状态二)应该初始成多少,只能初始为0。想一想如果初始为其他数值,是我们第1天买入股票后 手里还剩的现金数量是不是就不对了。

今天卖出了股票(状态三),同上分析,dp[0][2]初始化为0,dp[0][3]也初始为0。

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> dp(n,vector<int>(5,0));//1持有股票 2当天卖 3保持卖出 4冷冻期//之前定义0从未买过股票是因为买股票次数有限,现在不限则不需要定义。可以当天买当天卖。dp[0][1]=-prices[0];for(int i=1;i<n;i++){dp[i][1] = max(dp[i-1][4] - prices[i],max(dp[i-1][1],dp[i-1][3] - prices[i]));dp[i][2] = dp[i-1][1] + prices[i];dp[i][3] = max(dp[i-1][3],dp[i-1][4]);dp[i][4] = dp[i-1][2];}return max(dp[n-1][2],max(dp[n-1][3],dp[n-1][4]));}
};

有手续费

卖的时候扣手续费即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/873587.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请问如何修改网站架构模板?

修改网站架构模板需要一定的技术知识和经验。以下是一些基本的步骤:确定修改的目标:明确您想要修改的具体内容,例如页面布局、导航栏、侧边栏等。 备份原始模板:在进行任何修改之前,务必备份原始的网站架构模板,以防止意外错误或数据丢失。 选择合适的工具:根据您的技术…

请问网站首页内容在哪里修改?

网站首页内容的修改位置取决于您使用的网站构建工具或内容管理系统(CMS)。以下是一些常见的情况:静态HTML网站:如果您的网站是静态HTML网站,您需要直接编辑首页的HTML文件。通常,首页的HTML文件名为index.html或default.html。您可以使用文本编辑器(如Notepad++、Sublim…

网站创建的时间能修改吗?

一般来说,网站创建的时间是由服务器记录的,通常无法直接修改。这个时间通常是指网站首次被创建或部署的时间,它是一个固定的时间戳,用于记录网站的历史信息。 然而,在某些情况下,您可能可以通过修改服务器的配置文件或数据库来更改网站的创建时间。但这种操作需要一定的技…

如何修改网站文章的发布时间?

修改网站文章的发布时间通常可以通过以下几种方法实现:在内容管理系统(CMS)中修改:大多数CMS都提供了在文章编辑页面中修改发布时间的选项。您可以登录到CMS后台,找到相应的文章编辑页面,然后在其中找到时间字段并进行修改。这种方法通常是最安全和最常用的。使用数据库管…

如何修改网站模板中的图片?

修改网站模板中的图片通常可以通过以下步骤进行:登录到网站后台:打开您的浏览器,输入网站的域名或IP地址,然后输入用户名和密码登录到网站后台管理系统。 找到模板管理:在网站后台管理系统中,找到“模板”或“模板管理”选项,并点击进入。 选择要修改的模板:在模板管理…

网站入侵后数据库修复与安全加固的全面指南

网站入侵后,数据库的修复和安全加固至关重要,这不仅能恢复数据完整性,还能预防未来的攻击。以下是详细的步骤和建议:立即隔离受影响的服务器:一旦发现入侵迹象,立即将服务器从网络中隔离,防止进一步的数据泄露或破坏。断开互联网连接或关闭不必要的端口,限制外部访问。…

企业网站源代码修改的完整流程与最佳实践

修改企业网站的源代码是一项需要谨慎对待的任务,既要确保功能的正确实现,又要保障系统的稳定性。以下是具体的步骤和建议:制定详细的修改计划:在开始编码之前,先明确修改的目的和范围。列出所有需要调整的功能点,并评估它们对现有系统的影响。制定时间表,分配责任人,确…

在CMS系统中无法修改网站模板

问题描述:在CMS系统中无法修改网站模板。 可能原因及解决方法:权限不足:检查当前登录的用户账号是否具有修改模板的权限。如果权限不足,联系管理员提升权限。 模板文件被锁定:某些CMS系统可能会锁定模板文件,以防止误操作。查看CMS的文档或设置,了解如何解锁模板文件。 …

如何修改CMS网站底部的链接

问题描述:如何修改CMS网站底部的链接。 解决方法:登录CMS后台:使用管理员账号和密码登录到CMS的后台管理界面。 找到模板管理模块:在后台管理界面中,找到与模板管理相关的菜单或选项,通常会有“模板管理”、“主题管理”、“外观设置”等类似的名称。 选择要修改的模板:…

如何修改公司网站的内容

问题描述:如何修改公司网站的内容。 解决方法:使用内容管理系统(CMS):如果公司网站是使用CMS搭建的,如WordPress、Drupal、Joomla等,通常可以登录到CMS的后台管理界面,找到与内容管理相关的模块,如“文章管理”、“页面管理”、“产品管理”等。在这些模块中,可以进行…

如何高效可靠的进行云租户文件传输,提升业务效率?

随着数字经济的不断发展,金融企业面临着数字化转型的迫切需求。将大数据平台迁移到云端,是实现数字化转型的重要一步。云端迁移可以为金融企业提供灵活的开发和测试环境,提升开发和测试的灵活性和效率,有助于金融企业快速响应市场变化和客户需求。金融企业将大数据平台迁移…

VSCode使用之设置默认在当前文件目录下打开终端

在vscode界面依次点击“文件”→“首选项”→“设置”→“用户”→“功能”→“终端”,找到Integrated:Cwd选项,将其值修改为”${fileDirname}“,即可在所有打开的工程内实现终端默认在当前文件的路径启动