• 代码随想录算法训练营day50


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

    五部曲:

    dp数组下标及含义:

    • dp[i][0] 表示未操作;
    • dp[i][1]表示第一次持有;
    • dp[i][2]表示第一次未持有;
    • dp[i][3]表示第二次持有;
    • dp[i][4]表示第二次未持有

    dp数组初始化:

    • dp[i][0]=0;
    • dp[i][1]=-prices[0];
    • dp[i][2]=0;
    • dp[i][3]=-prices[0];
    • dp[i][4]=0

    递推公式:

    • dp[i][0]=dp[i-1][0];
    • dp[i][1] = max(dp[i - 1][1], dp[i][0]-prices[i]);
    • dp[i][2] = max(dp[i - 1][2], prices[i] + dp[i - 1][1]);
    • dp[i][3] = max(dp[i-1][3],dp[i][2]-prices[i]);
    • dp[i][4] = max(dp[i-1][4],dp[i][3]+prices[i])

    遍历方向:从前到后遍历

    class Solution {
    public:
        int maxProfit(vector& prices) {
            if (prices.size() == 0) return 0;
            vector> dp(prices.size(), vector(5, 0));
            dp[0][1] = -prices[0];
            dp[0][3] = -prices[0];
            for(int i=1;i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

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

    思路: 本题和上一题区别在于可以买卖k次,因此奇数是买入,偶数是卖出
    五部曲:

    dp数组下标及含义:

    • dp[i][0] 表示未操作;
    • dp[i][1]表示第一次持有;
    • dp[i][2]表示第一次未持有;
    • dp[i][3]表示第二次持有;
    • dp[i][4]表示第二次未持有

    dp数组初始化:

    • dp[i][0]=0;
    • dp[i][1]=-prices[0];
    • dp[i][2]=0;
    • dp[i][3]=-prices[0];
    • dp[i][4]=0

    当为奇数时都初始化为-prices[0]

    递推公式:

    • dp[i][0]=dp[i-1][0];
    • dp[i][1] = max(dp[i - 1][1], dp[i][0]-prices[i]);
    • dp[i][2] = max(dp[i - 1][2], prices[i] + dp[i - 1][1]);
    • dp[i][3] = max(dp[i-1][3],dp[i][2]-prices[i]);
    • dp[i][4] = max(dp[i-1][4],dp[i][3]+prices[i])

    遍历方向:从前到后遍历

    class Solution {
    public:
        int maxProfit(int k, vector& prices) {
            if (prices.size() == 0)
                return 0;
            vector> dp(prices.size(), vector(2 * k + 1, 0));
            for (int j = 1; j < 2 * k; j += 2) {
                dp[0][j] = -prices[0];
            }
            for (int i = 1; i < prices.size(); i++) {
                for (int j = 0; j < 2 * k - 1; j += 2) {
                    dp[i][j + 1] = max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
                    dp[i][j + 2] = max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
                }
            }
            return dp[prices.size() - 1][2 * k];
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    深入浅出MySQL-04-【常用函数】
    matplotlib 使用
    SQL UPDATE 语句(更新表中的记录)
    Kali镜像
    python对数据的处理合集——字典、列表...
    基于SSM的家庭理财系统的设计与实现
    TWAS模型数据*.wgt.RDat查看及导入R
    卷积神经网络(CNN)【第三章】
    设计模式之生产者/消费者模式
    041:mapboxGL移动到到某Layer上,更换鼠标形状
  • 原文地址:https://blog.csdn.net/Mitakiyuki/article/details/138153153