188 买卖股票的最佳时机 IV
题目链接
思路
结合股票III,将次数2延展为k,得到dp五部曲如下:
- dp数组含义:
dp[i][0][j]表示第i天不持股且进行了j次买卖后的最大利润;dp[i][1][j]表示第i天持股且进行了j次买卖后的最大利润 - 递推式:
dp[i][0][j] = max(dp[i-1][0][j],dp[i-1][1][j-1] + prices[i]);
dp[i][1][j] = max(dp[i-1][1][j],dp[i-1][0][j] - prices[i]);特别地,对于dp[i][0][0] = dp[i-1][0][0], dp[i][1][0] = dp[i-1][0][0] - prices[i] - 初始化:
dp[0][0][j] = 0, dp[0][1][j] = -prices[i]; - 遍历顺序:先遍历天数,再遍历第j次买卖
文章详解
cpp
class Solution {
public:
int maxProfit(int k,vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
vector<vector<vector<int>>> dp(n, vector<vector<int>>(2, vector<int>(k+1, 0)));
for(int j = 0; j <= k; j++)
{
dp[0][0][j] = 0;
dp[0][1][j] = -prices[0];
}
for (int i = 1; i < n; i++) {
dp[i][0][0] = dp[i - 1][0][0];
dp[i][1][0] = max(dp[i - 1][1][0], -prices[i]);
for(int j = 1; j <= k; j++)
{
dp[i][0][j] = max(dp[i-1][0][j],dp[i-1][1][j-1] + prices[i]);
dp[i][1][j] = max(dp[i-1][1][j],dp[i-1][0][j] - prices[i]);
}
//dp[i][0][1] = max(dp[i - 1][0][1], dp[i - 1][1][0] + prices[i]);
//dp[i][1][1] = max(dp[i - 1][1][1], dp[i - 1][0][1] - prices[i]);
}
return dp[n - 1][0][k];
}
};
714 股票含手续费
题目链接
思路
卖出时扣除手续费即可
文章详解
cpp
class Solution {
public:
int maxProfit(vector<int>& prices, int fee) {
int size = prices.size();
if(size == 1) return 0;
vector<vector<int>> dp(size,vector<int>(2,0));
dp[0][0] = 0; dp[0][1] = -prices[0];
for(int i = 1; i < size;i++)
{
dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i] - fee);
dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);
}
return dp[size-1][0];
}
};
309 买卖股票有冷冻期
题目链接
思路
考虑4个状态:不持股,买入,卖出,冷冻期,dp五部曲:
- dp数组含义:dp[i][j] 表示第i天j状态下的最大利润
- 递推:
dp[i][0] = max(dp[i-1][0], dp[i-1][3] );dp[i][1] = max(dp[i-1][1],dp[i-1][0] - prices[i]);dp[i][2] = dp[i-1][1] + prices[i];dp[i][3] = dp[i-1][2]; - 初始化:dp[0][0] = 0, dp[0][1] = -prices[i], dp[0][2] = 0, dp[0][3] = 0
- 遍历顺序:正序
文章详解
cpp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if (n == 0) return 0;
vector<vector<int>> dp(n, vector<int>(4, 0));
dp[0][0] -= prices[0]; // 持股票
for (int i = 1; i < n; i++) {
dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] = dp[i - 1][0] + prices[i];
dp[i][3] = dp[i - 1][2];
}
return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
}
};