代码随想录训练营第五十天123.买卖股票的最佳时机III188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III

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

讲解链接 代码随想录 (programmercarl.com)

之前做过只有一次购买机会的股票题,但是一道了两次就不知道如何是好了,答案代码随想录 (programmercarl.com)

的方法确实朴实无华:每一天都有可能的五个状态:

0 从未购买过股票

1 第一次持有

2 第一次卖出

3 第二次持有

4 第二次卖出

外层for循环,内层每次更新这五个状态的值:

cpp 复制代码
        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][1]+prices[i],dp[i-1][2]);
            dp[i][3]=max(dp[i-1][2]-prices[i],dp[i-1][3]);
            dp[i][4]=max(dp[i-1][3]+prices[i],dp[i-1][4]);
        }

188.买卖股票的最佳时机IV

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

讲解链接 代码随想录 (programmercarl.com)

相较于III,IV的购买次数变成了不确定,这时就需要总结规律:能取两次有五个状态,能取三次有七个状态,那么取k次就变成了2*k+1个状态,此时可以在天数的i循环中加入多个状态的j循环:

cpp 复制代码
        for(int i=1;i<prices.size();i++){
            for(int j=1;j<=k;j++){
                
                dp[i][2*j-1]=max(dp[i-1][2*j-1],dp[i-1][2*j-2]-prices[i]);
                dp[i][2*j]=max(dp[i-1][2*j],dp[i-1][2*j-1]+prices[i]);
            }
        }
相关推荐
dlraba8025 分钟前
机器学习-----SVM(支持向量机)算法简介
算法·机器学习·支持向量机
_poplar_11 分钟前
09 【C++ 初阶】C/C++内存管理
c语言·开发语言·数据结构·c++·git·算法·stl
2501_924747112 小时前
驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
人工智能·算法·计算机视觉·智能手机
limitless_peter2 小时前
优先队列,链表优化
c++·算法·链表
屁股割了还要学4 小时前
【数据结构入门】栈和队列
c语言·开发语言·数据结构·学习·算法·青少年编程
Monkey的自我迭代4 小时前
支持向量机(SVM)算法依赖的数学知识详解
算法·机器学习·支持向量机
阿彬爱学习5 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain6 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆9 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
qiuyunoqy9 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝