(50/60)买卖股票的最佳时机Ⅲ、买卖股票的最佳时机Ⅳ

day50

买卖股票的最佳时机Ⅲ

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

动态规划

代码实现

/*
意义:下标为i时,不同状态收益为
dp[i][0] 未持有
dp[i][1] 第一次持有
dp[i][2] 第一次未持有
dp[i][3] 第二次持有
dp[i][4] 第二次未持有
递推:
dp[i][0] =  dp[i-1][0]; 之前未持有
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]) 之前第二次持有、当天第二次持有
dp[i][4] =  max(dp[i-1][4],dp[i-1][3] + prices[i]) 之前第二次未持有、当天第二次未持有
初始化:
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
其余为0
遍历:
正序
*/

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(),vector<int>(5,0));
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        dp[0][2] = 0;
        dp[0][3] = -prices[0];
        dp[0][4] = 0;
        for(int i = 1;i < prices.size();i++){
            dp[i][0] =  dp[i-1][0]; // 之前未持有
            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]); // 之前第二次持有、当天第二次持有
            dp[i][4] =  max(dp[i-1][4],dp[i-1][3] + prices[i]); // 之前第二次未持有、当天第二次未持有
        }
        
        return dp[prices.size()-1][4];
    }
};

买卖股票的最佳时机Ⅳ

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

动态规划

思路

Ⅲ的升级版,这个也是通解(找规律)。

代码实现

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        vector<vector<int>> dp(prices.size(),vector<int>(2*k + 1,0));
        // init
        for(int i = 1;i < 2*k + 1;i += 2){
            dp[0][i] = -prices[0];
        }
        // traverse
        for(int i = 1;i < prices.size();i++){
            for(int j = 0;j < 2*k+1;j++){
                if(j == 0) dp[i][j] = dp[i-1][j];
                else if(j%2 == 1) dp[i][j] = max(dp[i-1][j],dp[i-1][j-1] - prices[i]);    // 奇数,购入
                else dp[i][j] = max(dp[i-1][j],dp[i-1][j-1] + prices[i]); // 偶数,卖出
            }
        }

        return dp[prices.size() - 1][2*k];
    }
};
posted @ 2024-03-21 23:49  Tazdingo  阅读(47)  评论(0)    收藏  举报