動態(tài)規(guī)劃,我們用兩個變量還記錄每天i的受益,一個記錄當天結(jié)束后沒有股票dp[i][0],一個記錄當天結(jié)束后持有股票dp[i][1],每天的受益假設只跟前一天相關,如果當天結(jié)束后沒有股票,有兩種情況,一是前一天持有股票,今天賣掉了,那么受益是前一天加上今天的股票價格:dp[i-1][1]+prices[i],二十前一天 沒有股票,那么受益跟前一天一樣:dp[ip-1][0];如果當天結(jié)束后持有股票,也是兩種情況,一種是前一天沒有股票,今天買入,那么今天的受益是昨天的減去今天的股票價格:dp[i-1][0]-prices[i],第二種情況是前一天就持有股票,那么今天的受益跟前一天一樣:dp[i-1][1]。通過這個動態(tài)方程計算每一天的值,我們初始化為dp[0][0]=0,dp[0][1]=-prices[1],結(jié)束時返回dp[n-1][0],因為今天的受益肯定是將股票全部拋出最大。
var maxProfit = function(prices) {
const n = prices.length;
const dp = new Array(n).fill(0).map(v => new Array(2).fill(0));
dp[0][0] = 0, dp[0][1] = -prices[0];
for (let i = 1; i < n; ++i) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp[n - 1][0];
};