【Leetcode】动态规划-188. 买卖股票的最佳时机 IV
题目
给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
思路
- 定义状态数组dp:第i天的状态是J 所剩下最大的现金
- 0 表示不操作 1 表示买入状态 2 表示卖出状态 3 表示买入状态 4 表示卖出状态 奇数表示买入状态 偶数表示卖出状态
- 题目中要求最多k笔交易 所以状态j最大是 2 * k + 1(1表示0状态)
- 当j为奇数的时候 全部初始化为-prices[0]
- dp[i][1] = max(dp[i - 1][0] - prices[i],dp[i - 1][1]);
- dp[i][2] = max(dp[i - 1][2],dp[i - 1][1] + prices[i]);
代码
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
// 定义状态数组dp:第i天的状态是J 所剩下最大的现金
// 0 表示不操作 1 表示买入状态 2 表示卖出状态 3 表示买入状态 4 表示卖出状态 奇数表示买入状态 偶数表示卖出状态
// 题目中要求最多k笔交易 所以状态j最大是 2 * k + 1(1表示0状态)
vector<vector<int>> dp(prices.size(),vector<int>(2 * k + 1,0));
// dp数组初始化
// 当j为奇数的时候 全部初始化为-prices[0]
for(int j = 0; j < 2 * k + 1; j++)
{
if(j % 2 == 1)
{
dp[0][j] = -prices[0];
}
}
// 状态转移方程
// dp[i][1] = max(dp[i - 1][0] - prices[i],dp[i - 1][1]);
// dp[i][2] = max(dp[i - 1][2],dp[i - 1][1] + prices[i]);
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] - prices[i],dp[i - 1][j + 1]);
dp[i][j + 2] = max(dp[i - 1][j + 2],dp[i - 1][j + 1] + prices[i]);
}
}
return dp[prices.size() - 1][2 * k];
}
};