day50
买卖股票的最佳时机Ⅲ
leetcode:123. 买卖股票的最佳时机 III
动态规划
代码实现
/*
意义:下标为i时,不同状态收益为
dp[i][0] 未持有
dp[i][1] 第一次持有
dp[i][2] 第一次未持有
dp[i][3] 第二次持有
dp[i][4] 第二次未持有
递推:
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;
其余为0
遍历:
正序
*/
class Solution {
public:
int maxProfit(vector<int>& prices) {
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];
}
};
买卖股票的最佳时机Ⅳ
leetcode:188. 买卖股票的最佳时机 IV
动态规划
思路
Ⅲ的升级版,这个也是通解(找规律)。
代码实现
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int>(2*k + 1,0));
// init
for(int i = 1;i < 2*k + 1;i += 2){
dp[0][i] = -prices[0];
}
// traverse
for(int i = 1;i < prices.size();i++){
for(int j = 0;j < 2*k+1;j++){
if(j == 0) dp[i][j] = dp[i-1][j];
else if(j%2 == 1) dp[i][j] = max(dp[i-1][j],dp[i-1][j-1] - prices[i]); // 奇数,购入
else dp[i][j] = max(dp[i-1][j],dp[i-1][j-1] + prices[i]); // 偶数,卖出
}
}
return dp[prices.size() - 1][2*k];
}
};
标签:买卖,int,max,60,持有,最佳时机,prices,dp
From: https://www.cnblogs.com/tazdingo/p/18088510