当前位置: 首页 > news >正文

算法学习 || 动态规划(买卖股票的最佳时机3)

买卖股票的最佳时机

leetcode链接

思路:

动态规划:

动规五部曲:
1.dp数组及其下标含义

dp数组为dp[ i ] [ j ]
i表示第i天,j表示0到4五种当天的状态,dp[ i ] [ j ]表示当天状态的利润
当天一共有五种状态
1.从未持有股票,(可以省略)
2.第一次持有股票
3.第一次未持有股票
4.第二次持有股票
5.第二次未持有股票
注意:不要把买入卖出的动作与持有未持有的状态搞混

2,确定递推公式

第一次持有股票的状态:
包含两种情况:
1.先前买入,继续持有:dp[ i-1 ] [ 1 ]
2.当天买入:dp[ i-1 ][ 0 ] - prices[ i ]
两种情况取最大值
递推公式:dp [ i ][ 1 ] = max(dp[ i-1 ][ 0 ] - prices[ i ] ,dp[ i-1 ] [ 1 ]);
第一次未持有股票状态:
包含两种情况:
1.保持之前未持有的状态:dp [ i-1] [ 2 ]
2.之前买入,第i天卖出:dp[ i-1] [ 1 ] + prices[ i ]
两种情况取最大值
递推公式:dp [ i ] [ 2 ] =max(dp[ i - 1 ][ 1 ] + prices[ i ],dp[ i -1 ][ 2 ]);
第二次持有股票的状态:
包含两种情况:
1.经历第一次买卖之后,在当天之前买入,继续持有:dp[ i -1][ 3 ]
2.经历第一次买卖之后,当天买入:dp [ i-1][ 2 ] -prices[ i ]
两种情况取最大值
递推公式:dp [ i ][ 3 ] = max(dp[ i -1][ 2 ] - prices[ i ] ,dp[ i-1 ] [ 3 ]);
第二次未持有股票的状态
包含两种情况:
1.经历第一次买卖之后,在当天之前已经卖出,继续保持未持有:dp [ i-1] [ 4 ]
2.经历第一次买卖之后,在当天之前买入,当天卖出:dp[ i-1] [ 3 ] + prices[ i ]
两种情况取最大值
递推公式:dp [ i ] [ 2 ] =max(dp[ i - 1 ][ 3] + prices[ i ],dp[ i -1 ][ 4 ]);

3.dp数组的初始化:

因为从未持有股票,没有利润:dp[ 0 ] [ 0] = 0
第一次持有股票的状态:
第一次持有一定是支付股票的钱:dp[ 0 ] [ 1 ] = - prices[ i ]
第一次未持有股票状态:
第一次未持有,理解为当天买入,当天买入:dp[ 0 ][ 2 ] = 0
第二次持有股票的状态:
因为是第一天,当天买入,当天卖出, 0收益,之后买入,所以收益为负:dp[ 0 ][ 3 ] = -prices[ i ]
第二次未持有股票的状态
理解为两次买入卖出,收益为0:dp[ 0 ] [ 4 ] = 0

4.确定遍历顺序:

从前往后

代码

class Solution {
public:int maxProfit(vector<int>& prices) {if(prices.size() == 0)return 0;vector<vector<int>> dp(prices.size(),vector<int>(5,0));dp[0][1] = -prices[0];dp[0][3] = -prices[0];for (int i = 1; i < prices.size(); i++) {dp[i][0] = dp[i - 1][0];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]);}return dp[prices.size() - 1][4];}
};

反思与总结:

重要的是搞清楚每一天有多少种状态,对应的递推公式,其他与之前的买卖股票思路一致

http://www.dtcms.com/a/471640.html

相关文章:

  • [GazeTracking] 视线数据获取 | refresh
  • Elastic × Jina AI
  • php 网站下载器备案 网站 收录
  • 编译原理机测客观题(1)绪论、文法与语言
  • 企业网站更新频率医疗器械网站制作
  • 培训机构网站源码购物网站发展规划与建设进度
  • 抽像代数概念理解——同构(isomorphism)
  • Tweedie 公式
  • 站长之家psd南漳网站开发
  • .net网站制作做游戏视频网站
  • 肇庆网站seowordpress评论发邮件
  • 网站服务器怎么迁移搜索引擎哪个好
  • 青岛建网站最新消息新闻头条
  • 郴州市北湖建设局网站设计师 网站
  • 双目视觉对熔池表面的三维重建研究总结
  • 【笔记】聊聊更强大的 epoll
  • 是做网站编辑还是做平面设计网站安全解决方案
  • QT5.15.2导入官方QtMqtt【Mingw32为例】
  • 上海做网站的月薪颜色搭配对网站重要性
  • Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法
  • 网站建设的投资预算怎么写阿里企业邮箱费用
  • 6网站建设做网站建设银行官网官方网站
  • 网页设计职位廊坊网络推广优化公司
  • 画家网站建设内蒙古赤峰市信息网官网
  • 哈尔滨网站制作专业md5 wordpress
  • 天猫商城官网首页seo关键词优化排名
  • 计算机操作系统 内存管理常见问题(菜鸡自学,非专业)
  • Python下载实战:高效获取网络资源
  • Python高级编程:创建可管理属性的完整指南
  • 维修网站建设网站开发职位要求