代码随想录二刷Day 52

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

代码不难写出来,就是四种情况难推导

class Solution {
public:
    int maxProfit(vector& prices) {
        vector> dp(prices.size(), vector(5, 0));
        dp[0][1] = -prices[0];
        dp[0][3] = -prices[0];
        for (int i = 1; i < prices.size(); i++) {
            dp[i][0] = 0;
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] - prices[i]); //j的1状态由前一天0状态推出
            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];;
    }
};

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

上一道题的规律版本,规律上一个题我已经看出来了,具体实现细节要再看看

class Solution {
public:
    int maxProfit(int k, vector& prices) {
        vector> dp(prices.size(), vector(2 * k + 1, 0));
        for ( int j = 1; j < 2 * k; j += 2) { //i是天数,j是状态数
            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];
    }
};

你可能感兴趣的:(算法,leetcode,数据结构)