Day50_动态规划
35. 买卖股票的最佳时机 III
1.状态定义:
dp[i][j]
表示第i天在状态j下,手上的现金数量,每天有5中可能的状态
dp[i][0]
表示第i天,没有买卖过股票的现金数dp[i][1]
表示第i天,之前或第i天当天买过一次股票,手上的现金数dp[i][2]
表示第i天,之前或第i天当天买卖一次股票,手上的现金数dp[i][3]
表示第i天,之前或第i天当天买入两次股票,卖出一次,手上的现金数dp[i][4]
表示第i天,之前或第i天当天买出两次股票,手上的现金数
- 状态转移方程:
dp[i][0] = dp[i - 1][0];
// 保持没有买卖过的状态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]);
// 保持之前买入两次的状态或者之前买卖过一次今天买入第二次dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
// 保持之前买入两次卖出一次的状态或者之前买入两次今天卖出
- 初始化:
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
- 递推顺序从前往后
class Solution {
public:
int maxProfit(vector<int>& prices) {
int prices_size = prices.size();
if (prices_size == 0) return 0;
vector<vector<int>> dp(prices_size, vector<int>(5, 0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
for (int i = 1; i < prices_size; i++) {
dp[i][0] = dp[i - 1][0];
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]);
dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
}
return dp[prices_size - 1][4];
}
};
36. 买卖股票的最佳时机 IV
和上一问相同的思路,只不过第二维代表的状态数从5变成了 2*k+1
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
int prices_size = prices.size();
if (prices_size == 0) return 0;
vector<vector<int>> dp(prices_size, vector<int>(2 * k + 1, 0));
// 初始化
for (int j = 1; j <= k; j++) {
dp[0][2 * j - 1] = -prices[0];
}
// dp
int states_type = 2 * k + 1;
for (int i = 1; i < prices_size; i++) {
for (int j = 1; j <= k; j++) {
int state_in = 2 * j - 1; // 之前买入的状态
int state_out = 2 * j; // 之前卖出的状态
dp[i][state_in] = max(dp[i - 1][state_in], dp[i - 1][state_in - 1] - prices[i]);
dp[i][state_out] = max(dp[i - 1][state_out], dp[i - 1][state_out - 1] + prices[i]);
}
}
return dp[prices_size - 1][2 * k];
}
};