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

动态规划17:123. 买卖股票的最佳时机 III

动态规划解题步骤:

1.确定状态表示:dp[i]是什么

2.确定状态转移方程:dp[i]等于什么

3.初始化:确保状态转移方程不越界

4.确定填表顺序:根据状态转移方程即可确定填表顺序

5.确定返回值

题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode)

题解:

1.状态表示:

f[k][i]表示截止第i天,第i天为可买入状态的最大利润,且当前已交易k次

g[k][i]表示截止第i天,第i天为可卖出状态的最大利润,且当前已交易k次

2.状态转移方程:

f[k][i]=max(f[k][i-1],g[k-1][i-1]+prices[i])

g[k][i]=max(g[k][i-1],f[k][i-1]-prices[i])

3.初始化:初始化第一列为负无穷(-0x3f3f3f3f),另外 f[0][0]=0   g[0][0]=-prices[0];

注意:对于f表,其本应该初始化第一行和第一列,但是为了优化代码和g表保持一致,可以只初始化第一列,对于第一行的数据只需对其状态转移方程添加位置判断即可,对于不合法的位置其状态转移方程为f[k][i-1],合法位置的状态转移方程为max(f[k][i-1],g[k-1][i-1]+prices[i])

4.填表顺序:从上往下,从左往右,两个表一起填

5.返回值:返回第n-1天为可买入状态的最大利润(交易次数可能为0、1、2)

class Solution {
public:const int INF=0x3f3f3f3f;int maxProfit(vector<int>& prices) {//f[k][i]表示截止第i天,第i天为可买入状态的最大利润,且当前已交易k次//g[k][i]表示截止第i天,第i天为可卖出状态的最大利润,且当前已交易k次//第i天为可买入状态,则前一天有两种情况:前一天为可买入状态,交易次数相同,今天什么也没做;//                                   前一天为可卖出状态,交易次数少1,今天卖出了股票//f[k][i]=max(f[k][i-1],g[k-1][i-1]+prices[i])//第i天为可卖出状态,则前一天有两种情况:前一天为可卖出状态,交易次数相同,今天什么也没做//                                   前一天为可买入状态,交易次数相同,今天买了股票//g[k][i]=max(g[k][i-1],f[k][i-1]-prices[i])size_t n=prices.size();//处理边界条件if(n==1) return 0;//创建dp表vector<vector<int>> f(3,vector<int>(n,-INF));vector<vector<int>> g(3,vector<int>(n,-INF));//初始化(创建dp表时已初始化一部分,相当于初始化了第一列)f[0][0]=0;g[0][0]=-prices[0];//填表for(int k=0;k<=2;++k){for(int i=1;i<n;++i){if(k-1>=0) f[k][i]=max(f[k][i-1],g[k-1][i-1]+prices[i]);else f[k][i]=f[k][i-1];g[k][i]=max(g[k][i-1],f[k][i-1]-prices[i]);}}//返回值return max(f[0][n-1],max(f[1][n-1],f[2][n-1]));}
};
http://www.lryc.cn/news/462876.html

相关文章:

  • 华为OD机试真题---预定酒店
  • 力扣242.有效的字母异位词
  • Android IP路由策略和防火墙
  • MySQL insert ... select 语句锁表导致数据写不进去
  • Android摄像头Camera2和Camera1的一些总结
  • 【Linux 从基础到进阶】Linux中的用户认证与授权
  • 用户界面设计:视觉美学与交互逻辑的融合
  • ZK集群搭建:详细步骤与注意事项
  • 如何将csdn文章导出为pdf
  • 【艾思科蓝】Imagen:重塑图像生成领域的革命性突破
  • java类和对象(下): 封装 static成员 内部类
  • 外包干了3周,技术退步太明显了。。。。。
  • VIVO算法题——数位之积
  • OPC Router快速打通设备层与influxDB数据通讯
  • 鸿蒙开发 四十四 ArkTs BuilderParam传递UI(二)
  • 同期数分析-留存率
  • Java前后端交互:构建现代Web应用
  • vue3中用axios请求怎么添加cookie
  • informer学习笔记
  • Elasticsearch介绍和使用
  • 【Flutter】基础入门:代码基本结构
  • 如何进行数据库缩容 | OceanBase应用实践
  • 机器学习和深度学习的差别
  • RAG拉满-上下文embedding与大模型cache
  • 前端学习---(2)CSS基础
  • Pandas常用计算函数
  • C++ | Leetcode C++题解之第473题火柴拼正方形
  • 深度解析RLS(Recursive Least Squares)算法
  • Centos 7.9NFS搭建
  • Python库numpy之三