leetcode 3573(买卖股票问题,状态机dp)

3573: 买卖股票的最佳时机Ⅴ

思路:状态机(买卖股票问题)

  • dfs(i,j,0) 表示在 prices0 到 pricesi 中完成至多 j 笔交易,第 i 天结束时未持有股票的最大利润。
  • dfs(i,j,1) 表示在 prices0 到 pricesi 中完成至多 j 笔交易,第 i 天结束时持有股票的最大利润。dfs(i,j,2) 表示在 prices0 到 pricesi 中完成至多 j 笔交易,第 i 天结束时处于做空中(空头状态)的最大利润。

此外,对于 dfs(i,j,0),在计算最大值时额外考虑在第 i 天买回股票(平空)的情况,即 dfs(i,j,2)−pricesi

复制代码
vector<array<long long,3>> f(k+2,{LLONG_MIN/2,LLONG_MIN/2,LLONG_MIN/2});

下标 0~k+1(三个状态 - 二维数组)

复制代码
class Solution {
public:
    long long maximumProfit(vector<int>& prices, int k) {
        int n=prices.size();
        vector<array<long long,3>> f(k+2,{LLONG_MIN/2,LLONG_MIN/2,LLONG_MIN/2});
        for(int j=1;j<=k+1;j++) f[j][0]=0; //保证f[j-1]不越界,j从1开始
        for(int p:prices){
            for(int j=k+1;j>0;j--){
                f[j][0]=max(f[j][0],max(f[j][1]+p,f[j][2]-p));
                f[j][1]=max(f[j][1],f[j-1][0]-p);
                f[j][2]=max(f[j][2],f[j-1][0]+p);
            }
        }

        return f[k+1][0];
    }
};
相关推荐
Zachery Pole7 小时前
CCF-CSP备战NO.5链表(1)
数据结构·链表
圣光SG9 小时前
Java操作题练习(七)
java·开发语言·算法
Cx330_FCQ10 小时前
Tmux使用
服务器·git·算法
拳里剑气11 小时前
C++算法:多源BFS
c++·算法·宽度优先·多源bfs
ysa05103012 小时前
【板子】短序列dp(换成维护更小常数维度的dp)
c++·笔记·算法·板子
shwill12312 小时前
PID 算法(三)--- 增量 PID ↔ 单神经元 PID 等价映射
linux·算法
wabs66613 小时前
关于图论【卡码网110.字符串迁移的思考】
数据结构·算法·图论
hanlin0314 小时前
刷题笔记:力扣第242、349题(哈希表)
笔记·算法·leetcode
浮沉98715 小时前
二分查找算法例题(二)
算法
only-qi15 小时前
大模型Agent面试攻略:落地工程痛点、评估体系与Agentic RAG核心精讲
人工智能·算法·面试·职场和发展·langchain·rag