121. 买卖股票的最佳时机
今天题还行,但是我加班了,很难受,搞完了,抓紧玩一会歇。
class Solution {
public:
int maxProfit(vector<int>& prices) {
//dp[x][0] 是不买(不持有)
//dp[x][1] 是买(持有)
int n = prices.size();
vector<vector<int>>dp(n,vector<int>(2,0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1;i < n;i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1] + prices[i]);
dp[i][1] = max(dp[i-1][1], -prices[i]); //只能买一次
}
return dp[n-1][0];
}
};
122.买卖股票的最佳时机II
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>>dp(n,vector<int>(2,0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1;i < n;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]); //他俩没有先后,因为都是用i-1
}
return dp[n-1][0];
}
};
用滚动数组也可以想到,直接就整出来啦。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
vector<vector<int>>dp(2,vector<int>(2,0));
dp[0][0] = 0;
dp[0][1] = -prices[0];
for(int i = 1;i < n;i++){
dp[i % 2][0] = max(dp[(i-1) % 2][0],dp[(i-1) % 2][1] + prices[i]);
dp[i % 2][1] = max(dp[(i-1) % 2][1],dp[(i-1) % 2][0] - prices[i]);
}
return dp[(n-1) % 2][0];
}
};