代码随想录算法训练营第50天|123.买卖股票的最佳时机III|188.买卖股票的最佳时机IV
详细布置
123.买卖股票的最佳时机III
这道题一下子就难度上来了,关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖。
视频讲解:https://www.bilibili.com/video/BV1WG411K7AR
https://programmercarl.com/0123.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIII.html
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
vector<vector<int>>dp(prices.size(),vector<int>(5,0));
dp[0][1]=-prices[0];
dp[0][3]=-prices[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];
}
};
总结
实际上买卖股票3和2思路差不多,但是把不操作的给显示出来,让程序运行更加明显。通过二维数组把i的状态全部出示。
188.买卖股票的最佳时机IV
本题是123.买卖股票的最佳时机III 的进阶版
视频讲解:https://www.bilibili.com/video/BV16M411U7XJ
https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BAIV.html
class Solution {
public:
int maxProfit(int k, vector<int>& prices) {
vector<vector<int>>dp(prices.size(),vector<int>(k*2+1,0));
for(int j=1;j<2*k;j+=2)
dp[0][j]=-prices[0];
for(int i=1;i<prices.size();i++)
{
for(int j=0;j<2*k;j+=2)
{
dp[i][j+1]=max(dp[i-1][j+1],dp[i-1][j]-prices[i]);
dp[i][j+2]=max(dp[i-1][j+2],dp[i-1][j+1]+prices[i]);
}
}
return dp[prices.size()-1][2*k];
}
};
总结
本题同理,这样子通过循环就可以解决这个问题。