class Solution {
public:
int maxProfit(vector<int>& prices) {
// int res =0 ;
// int low = INT_MAX;
// for (int i = 0; i < prices.size(); i++) {
// low = min(low, prices[i]);
// res = max(res, prices[i]-low);
// }
// return res;
// 动态规划方法
int len = prices.size();
if (len == 0) return 0;
vector<vector<int>> dp(len, vector<int>(2,0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; i++) {
// 持有股票
dp[i][0] = max(dp[i-1][0], -prices[i]);
// 不持有股票
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[len-1][1];
}
};
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 贪心
// int res = 0;
// for (int i = 1; i<prices.size(); i++) {
// if (prices[i]-prices[i-1] > 0){
// res += prices[i] - prices[i-1];
// }
// }
// 动态规划
int len = prices.size();
vector<vector<int>> dp(len, vector<int>(2,0));
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < len; i++) {
// dp[i][0]表示第i天持有股票的最大现金
dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices[i]);
// dp[i][1]表示第i天不持有股票的最大现金
dp[i][1] = max(dp[i-1][1], dp[i-1][0]+prices[i]);
}
return dp[len-1][1];
// return res;
}
};
最近忙于考研复试准备,没有时间写总结,同时学习深度肯定是不够的。股票问题I和II都可以用贪心和动态规划来解决,注意总结记忆。