题目描述
这道题可以用贪心思想解决。
本文介绍用动态规划解决。本题分析方法与第121题一样,详见leetcode 121. Best Time to Buy and Sell Stock
只有一点区别。第121题全程只能买入1次,因此如果第i天买入股票,买之前的金额肯定是初始金额0。本题可以买卖多次,情况分析见红色句子。
到第i天为止,导致此时持有股票的状态有两种可能的原因:一是到前一天(第i-1天)就是持有股票的状态(对应状态dp[i-1][0]),第i天什么也没做。二是第i天买入了股票(需要支付prices[i]),第i天能买入股票的前提是到第i-1天时是处于不持有股票的状态(对应状态dp[i-1][1]),这种情况是本题与第121题的唯一区别。
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
//假设账户起始金额是0,也就是假设可以赊账买股票
//dp[i][0]表示从第0天一直到第i天(包含第i天)为止,目前(第i天)处于持有股票的状态,账户里的最大金额
//dp[i][1]表示从第0天一直到第i天(包含第i天)为止,目前(第i天)处于不持有股票的状态,账户里的最大金额
vector<vector<int>> dp(n);
for(int i = 0;i < n;i++){
dp[i].resize(2);
}
dp[0][0] = - prices[0];//到第0天结束要处于持有股票的状态,那就是买入了第0天的股票,需要支付prices[0]
dp[0][1] = 0;//到第0天结束要处于不持有股票的状态,那就是不买入第0天的股票或者当天买入当天卖出,账户变动是0,金额保持初始值0
for(int i = 1;i < n;i++){
//到第i天为止,导致此时持有股票的状态有两种可能的原因:
//一是到前一天(第i-1天)就是持有股票的状态(对应状态dp[i-1][0]),第i天什么也没做
//二是第i天买入了股票(需要支付prices[i]),第i天能买入股票的前提是到第i-1天时是处于不持有股票的状态(对应状态dp[i-1][1]),这种情况是本题与第121题的唯一区别
dp[i][0] = max(dp[i-1][0],dp[i-1][1] - prices[i]);
//到第i天为止,导致此时处于不持有股票的状态有两种可能的原因:
//一是到前一天(第i-1天)就是不持有股票的状态(对应状态dp[i-1][1]),第i天什么也没做
//二是第i天卖出了股票(收入prices[i]),第i天能够卖出股票的前提是第i-1天是处于持有股票的状态(对应状态dp[i-1][0])
dp[i][1] = max(dp[i-1][1],dp[i-1][0]+prices[i]);
}
return dp[n-1][1];
}
};