122. 买卖股票的最佳时机 II
//画图发现最终结果就是折线图的所有上升区间的首尾
//所以问题就变成了怎么找上升区间的首尾
//动态规划的解法:
//定义dp[i][0]表示第i天交易结束后没有持有股票的最大利润
//定义dp[i][1]表示第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])
//今天有股票,要么昨天就有了,要么昨天没有,今天买入,所以减去今天的股票价格
//初始化的原则就是不能让状态转移方程中出现负数
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
//创建二维dp数组
int dp[n][2];
//初始化初始条件
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]);
}
//最后收益最大的肯定是卖出股票的
return dp[n-1][0];
}
};
//贪心思想:画折线图发现所有上升阶段的总和就是最大收益
//因此可以不用考虑中间过程开始极限操作,就认为只要明天的价格比今天的价格高,高出部分就是我的收益,虽然实际操盘不可能做到,但是贪心可以极限化
class Solution {
public:
int maxProfit(vector<int>& prices) {
int sum = 0;
if(prices.size() < 1) return 0;
for(int i = 0; i < prices.size()-1; i++)
{
if(prices[i] < prices[i+1])
{
sum += (prices[i+1] - prices[i]);
}
}
return sum;
}
};