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

动态规划18:188. 买卖股票的最佳时机 IV

动态规划解题步骤:

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

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

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

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

5.确定返回值

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

题解:

本题与动态规划17:123. 买卖股票的最佳时机 III 几乎无异

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......K)所以需要遍历第n-1列

class Solution {
public:int maxProfit(int K, vector<int>& prices) {const int INF=0x3f3f3f3f;//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(K+1,vector<int>(n,-INF));vector<vector<int>> g(K+1,vector<int>(n,-INF));//初始化(创建dp表时已初始化一部分,相当于初始化了第一列)f[0][0]=0;g[0][0]=-prices[0];//填表for(int k=0;k<=K;++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]);}}//返回值int ans=INT_MIN;for(int k=0;k<=K;++k)if(f[k][n-1]>ans) ans=f[k][n-1];return ans;}
};
http://www.lryc.cn/news/465129.html

相关文章:

  • YOLOv8改进 - 注意力篇 - 引入ShuffleAttention注意力机制
  • 基于Multisim的8路彩灯循环控制电路设计与仿真
  • 完整的模型训练套路 pytorch
  • 2024年十大前沿图像分割模型汇总:工作机制、优点和缺点介绍
  • Notepad++将搜索内容所在行选中,并进行复制等操作
  • [Java EE] IP 协议 | NAT 机制 | 路由选择 | MAC 地址 | 域名解析服务
  • 赋能特大城市水务数据安全高速运算,深圳计算科学研究院YashanDB数据库系统斩获“鼎新杯”二等奖
  • RAYDATA链接PGSQL做图表
  • UE5里的TObjectPtr TSharedPtr TWeakPtr有什么区别
  • 前端--深入理解HTTP协议
  • 线性代数 向量
  • go中阶乘实现时递归及迭代方式的比较
  • Jupyter notebook中更改字体大小
  • 关于Ubuntu服务器的时间同步设置以及Linux什么时候开始使用swap虚拟内存
  • Java Stream API 详解
  • 一文了解大模型中的SDK和API
  • element plus的el-select分页
  • STM32CubeMX【串口收发USART】
  • 【学术会议投稿】Java Web开发实战:从零到一构建动态网站
  • [Unity]内存优化
  • FreeRTOS工程创建,创建多任务程序,基于汇编对ARM架构的简单理解
  • C++STL--------list
  • M1 Mac打开Jupyter notebook
  • docker 仓库之harbor详解
  • 【环境变量】windons的Path
  • go语言里的切片
  • 革新你的智能体验:AIStarter 3.1.1正式版现已上线【安全认证】ai应用市场,数字人,ai绘画,ai视频,大模型,工作流因有尽有
  • 【练习17】数组中的最长连续子序列
  • 2024 最适合 Web 开发者的 9 款 Chrome 扩展
  • React综合指南(二)