【股票系列】122. 買賣股票的最佳時機II

給你一個整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。
在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。
返回 你能獲得的 最大 利潤 。

解題思路:動態(tài)規(guī)劃

(1) 定義dp數(shù)組
我們使用一維來定義天數(shù),另一維定義狀態(tài)。(具體來說:是否持有股票)
● dp[i][0]:前 i 天(包括 i )持有股票,獲取的最大利潤;
● dp[i][1]:前 i 天(包括 i )沒有持有股票,獲取的最大利潤。

(2) 狀態(tài)轉移方程
當經過了 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])

? 區(qū)別于一次買賣!本題買賣可以進行多次,具體體現(xiàn)在持有股票上
● 一次買賣:如果買入第 i 天的股票,那么第i天持有股票的最大利潤,即dp[i][0]一定就是 -prices[i];
● 多次買賣:所持有的現(xiàn)金可能有之前買賣過的利潤。如果買入第 i 天的股票,那么第i天持有股票的最大利潤,可能為 dp[i-1][1] - prices[i],還要和dp[i-1][0]比較,看哪個利潤大;

(3) 初始化
● dp[0][0] = -prices[0]
● dp[0][1] = 0

(4) 遍歷順序
從前到后

(5) 舉例:略。

class Solution {
    public int maxProfit(int[] prices) {
        // dp[i][0]:前 i 天(包括第 i 天),持有股票 獲得的最大利潤
        // dp[i][1]:前 i 天(包括第 i 天),沒有持有股票 獲得的最大利潤
        int[][] dp = new int[prices.length][2];
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for(int i=1; i<prices.length; 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[prices.length-1][1];
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容