https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/
思路: d p [ i ] dp[i] dp[i]表示第 i i i天最多能赚多少钱,很容易写出 O ( n 2 ) O(n^2) O(n2)的 d p dp dp。
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];
}
};
思路:用 d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示在第 i i i天未持有买入的股票时前 i i i天最多能赚多少钱,用 d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示在第 i i i天持有买入的股票时前 i i i天最多能赚多少钱,那么有: d p [ i ] [ 0 ] = m a x ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] + p r i c e [ i ] ) dp[i][0]=max(dp[i-1][0],dp[i-1][1]+price[i]) dp[i][0]=max(dp[i−1][0],dp[i−1][1]+price[i]) d p [ i ] [ 1 ] = m a x ( d p [ i − 1 ] [ 1 ] , d p [ i − 2 ] [ 0 ] − p r i c e [ i ] ) dp[i][1]=max(dp[i-1][1],dp[i-2][0]-price[i]) dp[i][1]=max(dp[i−1][1],dp[i−2][0]−price[i])答案就是 d p [ n − 1 ] [ 0 ] dp[n-1][0] dp[n−1][0]。
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];
}
};