(leetcode算法题)188. 买卖股票的最佳时机 IV

题目中要求最多可以完成k次交易,很多时候不要把问题搞复杂了,

按照题目要求,研究对象是最后一天结束后最多进行了 k 次交易获得的最大利润

那么就可以把问题拆分成

第 1 天结束后完成 0 次交易获得的最大利润,第 1 天结束后完成 1 次交易获得的最大利润,

第 1 天结束后完成 k 次交易获得的最大利润,

第 2 天结束后完成 0 次交易获得的最大利润,第 2 天结束后完成 1 次交易获得的最大利润,

第 2 天结束后完成 k 次交易获得的最大利润,

第 i 天结束后完成 0 次交易获得的最大利润,第 i 天结束后完成 1 次交易获得的最大利润,

第 i 天结束后完成 k 次交易获得的最大利润,

由于规则中强调不能同时参与多笔交易,所以前一天是否持有股票会影响第二天

值得注意的是,需要针对前一天已经处于未持有股票的状态进行特殊分析

已知到了第 i 天的开始,已经完成了 j 次交易,且第 i 天可以买入股票,

那么第 i 天可以做的决策就是:买入股票,或者静观其变

此时买入股票确实会影响之后的递归,但即使买入股票,也不构成新的交易

可以将状态表示定义为:

f[i][j]: 第 i 天结束后,完成了 j 次交易,处于持有股票的状态所获得的最大利润

g[i][j]: 第 i 天结束后,完成了 j 次交易,处于未持有股票的状态所获得的最大利润

状态转移方程:

g[i][j] = g[i - 1][j];

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

if(j - 1 >= 0){

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

}

cpp 复制代码
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int n = prices.size();
        vector<vector<int>> f(n, vector<int>(k + 1, -1 * 0x3fffff));
        vector<vector<int>> g(n, vector<int>(k + 1, -1 * 0x3fffff));
        // 此题可以不做dp初始化扩容,只需要因为第一天的处于两种状态的情况的最大利润已知
        f[0][0] = -1 * prices[0];
        g[0][0] = 0;
        for (int i = 1; i < n; i++){
            for (int j = 0; j < k + 1; j++){
                g[i][j] = g[i - 1][j];
                f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]);
                if(j - 1 >= 0){
                    g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i]);
                }
            }
        }
        int ret = 0;
        for(int j = 0; j <= k; ++j){
            ret = max(ret, g[n - 1][j]);
        }
        return ret;
    }
};
相关推荐
故事和你911 分钟前
洛谷-算法2-2-常见优化技巧3
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
菜鸟555557 分钟前
2025江西省CCPC省赛暨全国邀请赛(南昌)
数据结构·c++·算法·acm·思维·ccpc·xcpc
lds走自己的路19 分钟前
全局坐标转局部坐标推导
人工智能·算法·机器学习
6Hzlia23 分钟前
【Hot 100 刷题计划】 LeetCode 21. 合并两个有序链表 | C++ 经典迭代与 Dummy 技巧
c++·leetcode·链表
杨校26 分钟前
杨校老师课堂之C++高精度乘法
算法
上弦月-编程26 分钟前
C语言位运算:从入门到精通
运维·c语言·开发语言·vscode·算法·leetcode·极限编程
꧁细听勿语情꧂40 分钟前
用队列实现栈、用栈实现队列,树、二叉树、满二叉树、完全二叉树,堆、向下向上调整算法、出堆入堆、堆排序
c语言·开发语言·数据结构·算法
碧海银沙音频科技研究院43 分钟前
BES2800BP_nuttx编译环境搭建方法
人工智能·深度学习·算法
Felven1 小时前
B. Make Almost Equal With Mod
数据结构·算法
脆皮炸鸡7551 小时前
Linux~~基础IO
linux·运维·服务器·经验分享·算法·学习方法