买卖股票的最佳时机IV
学习记录自代码随想录
要点:1.类似于Leetcode 121这道题,只不过多了几轮,循坏递推就可以
cpp
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int n = prices.size();
// 1.dp[i][2*k]
vector<vector<int>> dp(n, vector<int>(2*k, 0));
// 2.递推公式:dp[i][0] = max(dp[i-1][0], -prices[i])
// 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])
// ............
// 3.初始化:dp[0][0], dp[0][2], dp[0][4]............为-prices[0],其余为0
for(int i = 0; i < k; i++){
dp[0][2*i] = -prices[0];
}
// 4.正向遍历
for(int i = 1; i < n; i++){
dp[i][0] = max(dp[i-1][0], -prices[i]);
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
for(int j = 1; j < k; j++){
dp[i][2*j] = max(dp[i-1][2*j], dp[i-1][2*j-1]-prices[i]);
dp[i][2*j+1] = max(dp[i-1][2*j+1], dp[i-1][2*j]+prices[i]);
}
}
// 5.举例推导递推公式
return dp[n-1][2*k-1];
}
};