https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
思路:表示第天最多能賺多少錢,很容易寫出的。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int siz=prices.size();
if(!siz)
return 0;
vector<int> dp(siz,0);
for(int i=1;i<siz;i++)
{
dp[i]=max(dp[i],dp[i-1]);
if(i>=2)
dp[i]=max(dp[i],dp[i-2]);
for(int j=i-3;j>=0;j--)
dp[i]=max(dp[i],dp[j]+prices[i]-prices[j+2]);
dp[i]=max(dp[i],prices[i]-prices[1]);
dp[i]=max(dp[i],prices[i]-prices[0]);
}
return dp[siz-1];
}
};
思路:用表示在第天未持有買入的股票時前天最多能賺多少錢,用表示在第天持有買入的股票時前天最多能賺多少錢,那麼有:答案就是。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int siz=prices.size();
if(siz<=1)
return 0;
if(siz==2)
return max(0,prices[1]-prices[0]);
vector<vector<int>> dp(siz);
for(int i=0;i<siz;i++)
dp[i].resize(2);
dp[0][0]=0,dp[0][1]=-prices[0];
dp[1][0]=max(0,prices[1]-prices[0]);
dp[1][1]=max(dp[0][1],-prices[1]);
for(int i=2;i<siz;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-2][0]-prices[i]);
}
return dp[siz-1][0];
}
};