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; } };

浙公网安备 33010602011771号