这道题与leetcode 121是差不多的唯一的区别只有dp[i][0]处的一小段表达式
回顾一下此题的dp函数的定义:
1. dp[i][0]存放 持有股票的利润 max(昨天就持有 或 今天才买加上昨天的利润 ps:这就是本题的核心重点 与上题唯一的区别在这里)‘
/*为什么持有股票会有利润呢,因为这里持有股票时候设负数,使得加的时候就有利润了*/
(只是我上题便于理解就变成正数取最小值,dpi 1的时候相加了,应当此类题均将dp[i][0]直接买入股票的值设负数)
2. dp[i][1]存放 未持有股票的利润 (昨天就没持有 或 今天才卖出)
换句话说 dp[i][0]就是成本,dp[i][0]就是利润,成本和利润仅取决于昨天
因为可以多次买卖 就用dp[i-1][1]-prices[i] 等价-prices[i]+dp[i-1][1]
而在上题只有-prices[i]
为什么要这么写呢?
因为可以继承前面卖出后的利润,再卖的时候可以加上之前的利润
代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n=prices.size();
vector<vector<int>>dp(n,vector<int>(2));
dp[0][0]=-prices[0];//持有股票的最大利润 之前就有股票或者今天买入股票
dp[0][1]=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][1]昨天挣到钱的利润来买入股票
dp[i][1]=max(dp[i-1][1],prices[i]+dp[i-1][0]);
}
return dp[n-1][1];
}
};