其实个人觉得和 买卖股票的最佳时机III,是一样的,就是多用下标来表示状态即可
找出规律就可以用循环来解决啦~
j 的循环 是两个两个跳的
注意:
这里两个关于 j 的循环起始位置不一样,这和循环中的内容有关
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
/*
想到了用循环来初始化嘻嘻
*/
vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
// 初始化
for(int j = 1 ; j < 2 * k; j += 2) // 这里是 += 2
{
dp[0][j] = -prices[0];
}
for(int i = 1 ; i < prices.size(); i++)
{
for(int j = 0; j < 2 * k - 1; j += 2) // 这里是 += 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];
}
};