动态规划 Leetcode 123 买卖股票的最佳时机III

买卖股票的最佳时机III

Leetcode 121

学习记录自代码随想录

要点:1.需要想清楚每天有四种状态,持有第一支股票-不持有第一支股票-持有第二支股票-不持有第二支股票,从而明确出dp数组的定义;
2.递推公式想到对每个状态分别做递归,并且四个状态有时序关系,所以每个状态一定是和前一个状态有关联,如此寻找到递归关系表达式;
3.持有股票不一定就要当天买入股票,也有可能i-1天买入股票,两者取较大值递归;
4.不持有股票可以是i-1天就已经不持有股票,也可以是在当天卖出股票,同样取两者种较大值;

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if(n == 1) return 0;
        // 1.dp[i][0-3] 第i天是否持有股票有4种状态分别代表0持有第一支股票,1不持有第一支股票,2持有第二支股票,3不持有第二支股票
        // dp[i][0-3] 第i天四种状态下各自最大利润
        vector<vector<int>> dp(n, vector<int>(4, 0));
        // 2.递推公式
        // 3.dp数组初始化:dp[0][0], dp[0][2]
        dp[0][0] = -prices[0];  // 第0天持有第一支股票,则初始化为-prices[0]此时没钱
        dp[0][2] = -prices[0];  // 第0天持有第二支股票,买入卖出第一支后,再买如第二支,则同样初始化为-prices[0]
        // 4.遍历顺序:正向遍历
        for(int i = 1; i < n; i++){
            // 递推公式很有规律
            dp[i][0] = max(dp[i-1][0], -prices[i]);
            dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
            dp[i][2] = max(dp[i-1][2], dp[i-1][1]-prices[i]);
            dp[i][3] = max(dp[i-1][3], dp[i-1][2]+prices[i]);
        }
        // 5.举例推导dp数组
        return dp[n-1][3];
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 08:44:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 08:44:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 08:44:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 08:44:04       20 阅读

热门阅读

  1. How to install PyAlink on Ubuntu 22.04

    2024-03-22 08:44:04       19 阅读
  2. Ubuntu---之进程/线程管理命令

    2024-03-22 08:44:04       15 阅读
  3. 请解释 VB.NET 中的事件(Event)

    2024-03-22 08:44:04       16 阅读
  4. AI大模型学习

    2024-03-22 08:44:04       15 阅读
  5. python练习2

    2024-03-22 08:44:04       17 阅读
  6. Tomcat调优

    2024-03-22 08:44:04       16 阅读
  7. HTML世界之标签Ⅵ

    2024-03-22 08:44:04       18 阅读
  8. [Vue]路由

    2024-03-22 08:44:04       19 阅读
  9. 使用pytest和qt实现可勾选测试用例的界面

    2024-03-22 08:44:04       18 阅读