188.买卖股票的最佳时机IV
动规五部曲:
- dp数组的含义:
- dp[j][2*i-1] 表示第i次持有股票
- dp[j][2*i] 表示第i次不持有股票
- 递推公式:
- dp[j][2i-1] = max(dp[j-1][2i-1], dp[j-1][2*i-2] - prices[j]);
- dp[j][2i] = max(dp[j-1][2i], dp[j-1][2*i-1] + prices[j]);
- 初始化:
持有股票初始化为-prices[0] - 遍历顺序:从小到大遍历
- 打印dp数组
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
// dp数组dp[0][0]:不操作
// dp[0][2 * i - 1]:第i次持有
// dp[0][2 * i]: 第i次不持有
vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
// 初始化2 * i - 1初始化为-prices[0];
for(int i = 1; i <= k; ++i) {
dp[0][2 * i - 1] = -prices[0];
}
for(int j = 1; j < prices.size(); ++j) {
for(int i = 1; i <= k; ++i) {
dp[j][2*i-1] = max(dp[j-1][2*i-1], dp[j-1][2*i - 2] - prices[j]);
dp[j][2*i] = max(dp[j-1][2*i], dp[j-1][2*i - 1] + prices[j]);
}
}
return dp[prices.size()-1][2*k];
}
};
309.买卖股票的最佳时机含冷冻期
动规五部曲:
- dp数组的含义
- dp[j][0] 持有股票
- dp[j][1] 保持卖出股票
- dp[j][2] 具体卖出股票
- dp[j][3] 冷冻期
- 递推公式:
- dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
- dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
- dp[j][2] = dp[j-1][0] + prices[j];
- dp[j][3] = dp[j-1][2];
- 初始化
- dp[0][0] = -prices[0];
- dp[0][1] = 0;
- dp[0][2] = 0;
- dp[0][3] = 0;
- 遍历顺序:从前向后
- 打印dp数组
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(), vector<int>(4, 0));
// 初始化
dp[0][0] = -prices[0];
for(int j = 1; j < prices.size(); ++j) {
dp[j][0] = max(dp[j-1][0], max(dp[j-1][3] - prices[j], dp[j-1][1] - prices[j]));
dp[j][1] = max(dp[j-1][3], dp[j-1][1]);
dp[j][2] = dp[j-1][0] + prices[j];
dp[j][3] = dp[j-1][2];
}
// 打印dp数组
for(auto vec : dp) {
for(int val : vec) cout << val << " ";
cout << endl;
}
return max(dp[prices.size() - 1][2], max(dp[prices.size() - 1][1], dp[prices.size() - 1][3]));
}
};
714.买卖股票的最佳时机含手续费
- dp数组的含义
- dp[j][0] 持有股票
- dp[j][1] 不持有股票
- 递推公式:
- dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
- dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
- 初始化
- dp[0][0] = -prices[0];
- dp[0][1] = 0;
- 遍历顺序:从前向后遍历
- 打印dp数组
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
// dp[j][0] 持有股票
// dp[j][1] 不持有股票
vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
// 递推公式
// dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
// dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
// 初始化
dp[0][0] = -prices[0];
for(int j = 1; j < prices.size(); ++j) {
dp[j][0] = max(dp[j-1][0], dp[j-1][1] - prices[j]);
dp[j][1] = max(dp[j-1][1], dp[j-1][0] + prices[j] - fee);
}
return dp[prices.size() - 1][1];
}
};
标签:vector,买卖,int,股票,最佳时机,max,prices,dp
From: https://www.cnblogs.com/cscpp/p/18282597