leetcode 买卖股票的最佳时机IV 困难

 

 

dp[i][j][k], 前 i 个数, 完成 j 笔交易, k: 0, 不持股, k: 1 持股....状态转移方程如下:

dp[i][j][0] = dp[i - 1][j][0];

if(j > 0) dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - 1][1] + prices[i]);

dp[i][j][1] = max(dp[i - 1][j][0] - prices[i], dp[i - 1][j][1]);

// 不过以下代码,时间超过 14%,空间 8%.....仔细看了一下,复杂度没有问题,可能是vector三维开空间费时间???

// 然后 i 这一维数组可以滚动,最后 71% 与 61%

 

class Solution {
public:
    int maxProfit(const int &n, const vector<int>& prices) {
        if(prices.empty()) return 0;
        // dp[i][j][k], 前 i 个数, 完成 j 笔交易, k: 0, 不持股, k: 1 持股
        vector<vector<vector<int>>> dp(prices.size(), vector<vector<int>>(n + 1, vector<int>(2, -1e9)));
        for(int i = 0; i < prices.size(); ++ i) {
            if(i == 0) {
                dp[0][0][0] = 0;
                dp[0][0][1] = -prices[i];
                continue;
            }
            for(int j = 0; j <= min(i, n); ++ j) {  // 前 i - 1 个数, 最多完成 i 笔交易
                dp[i][j][0] = dp[i - 1][j][0];
                if(j > 0) {
                    dp[i][j][0] = max(dp[i][j][0], dp[i - 1][j - 1][1] + prices[i]);
                }
                dp[i][j][1] = max(dp[i - 1][j][0] - prices[i], dp[i - 1][j][1]);
            }
        }
        int ret = 0;
        for(int j = 0; j <= n; ++ j) {
            ret = max(ret, dp.back()[j][0]);
        }
        return ret;
    }
};

 

posted @ 2021-08-31 23:03  rookie_Acmer  阅读(27)  评论(0)    收藏  举报