第九章 动态规划part08
股票问题是一个动态规划的系列问题,前两题并不难,第三题有难度。
121. 买卖股票的最佳时机
视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int>(2,0));
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.size();i++){
dp[i][0]=max(dp[i-1][1]+prices[i],dp[i-1][0]);
dp[i][1]=max(dp[i-1][1],-prices[i]);
}
return dp[prices.size()-1][0];
}
};
122.买卖股票的最佳时机II
视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<vector<int>> dp(prices.size(),vector<int>(2));
dp[0][0]=0;
dp[0][1]=-prices[0];
for(int i=1;i<prices.size();i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]+prices[i]);
dp[i][1]=max(dp[i-1][1],dp[i-1][0]-prices[i]);
}
return dp[prices.size()-1][0];
}
};
123.买卖股票的最佳时机III
这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。
视频讲解:动态规划,股票至多买卖两次,怎么求? | LeetCode:123.买卖股票最佳时机III_哔哩哔哩_bilibili
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> dp(5);
dp[1]=-prices[0]; //第一次购入
dp[2]=0; //第一次卖出
dp[3]=-prices[0]; //第二次购入
dp[4]=0; //第二次卖出
for(int i=0;i<prices.size();i++){
dp[1]=max(dp[1],dp[0]-prices[i]);
dp[2]=max(dp[2],dp[1]+prices[i]);
dp[3]=max(dp[3],dp[2]-prices[i]);
dp[4]=max(dp[4],dp[3]+prices[i]);
}
return dp[4];
}
};

171

被折叠的 条评论
为什么被折叠?



