力扣算法刷题 Day 42(股票问题总结)

188 买卖股票的最佳时机 IV

题目链接

添加链接描述

思路

结合股票III,将次数2延展为k,得到dp五部曲如下:

  1. dp数组含义:dp[i][0][j]表示第i天不持股且进行了j次买卖后的最大利润;dp[i][1][j]表示第i天持股且进行了j次买卖后的最大利润
  2. 递推式: dp[i][0][j] = max(dp[i-1][0][j],dp[i-1][1][j-1] + prices[i]);
    dp[i][1][j] = max(dp[i-1][1][j],dp[i-1][0][j] - prices[i]);特别地,对于dp[i][0][0] = dp[i-1][0][0], dp[i][1][0] = dp[i-1][0][0] - prices[i]
  3. 初始化:dp[0][0][j] = 0, dp[0][1][j] = -prices[i];
  4. 遍历顺序:先遍历天数,再遍历第j次买卖
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(int k,vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;

        vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(k+1, 0)));

        for(int j = 0; j <= k; j++)
        {
            dp[0][0][j] = 0;
            dp[0][1][j] = -prices[0];
        }

        for (int i = 1; i < n; i++) {
            dp[i][0][0] = dp[i - 1][0][0];
            dp[i][1][0] = max(dp[i - 1][1][0], -prices[i]);
            for(int j = 1; j <= k; j++)
            {
                dp[i][0][j] = max(dp[i-1][0][j],dp[i-1][1][j-1] + prices[i]);
                dp[i][1][j] = max(dp[i-1][1][j],dp[i-1][0][j] - prices[i]);

            }
            //dp[i][0][1] = max(dp[i - 1][0][1], dp[i - 1][1][0] + prices[i]);
            //dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][1] - prices[i]);

        }

        return dp[n - 1][0][k];
    }
};

714 股票含手续费

题目链接

添加链接描述

思路

卖出时扣除手续费即可

文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int size = prices.size();
        if(size == 1)   return 0;
        vector<vector<int>> dp(size,vector<int>(2,0));
        dp[0][0] = 0; dp[0][1] = -prices[0];

        for(int i = 1; i < size;i++)
        {
            dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i] - fee);
            dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);
        }
        return dp[size-1][0];
    }
};

309 买卖股票有冷冻期

题目链接

添加链接描述

思路

考虑4个状态:不持股,买入,卖出,冷冻期,dp五部曲:

  1. dp数组含义:dpij 表示第i天j状态下的最大利润
  2. 递推:dp[i][0] = max(dp[i-1][0], dp[i-1][3] ); dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]); dp[i][2] = dp[i-1][1] + prices[i]; dp[i][3] = dp[i-1][2];
  3. 初始化:dp00 = 0, dp01 = -pricesi, dp02 = 0, dp03 = 0
  4. 遍历顺序:正序
文章详解

添加链接描述

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;
        vector<vector<int>> dp(n, vector<int>(4, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i];
            dp[i][3] = dp[i - 1][2];
        }
        return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    }
};
相关推荐
有毒的教程13 分钟前
Dev-C++ 避免爆栈(Stack Overflow)完整方案
c++·算法·深度优先
在所不辞兄29 分钟前
刚性问题误差容限设置技巧
深度学习·神经网络·算法·机器学习
啊啊啊啊啊!!!!32 分钟前
unordered_map和unordered_set的使用
算法
java_nnnn1 小时前
LeetCode刷题双指针(快乐数+盛最多水的容器)Java
算法·leetcode·职场和发展
yi0119 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
YangYang9YangYan10 小时前
2027 秋招|数据科学与大数据技术面试项目价值回答思路,告别纯代码描述
大数据·面试·职场和发展
灯澜忆梦12 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下12 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J12 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛12 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法