Leekow-309 株式の売買に最適な時期には凍結期間 (dp) が含まれます

Leekow-309 株式の売買に最適な時期には凍結期間が含まれる

1. トピック

309. 株式の売買に最適な時期には凍結期間が含まれる

整数の配列を指定するpricesと、 thprices[i]ith 日目の株価を表します。

最大利益を計算するアルゴリズムを設計します。次の制約に従って、できるだけ多くのトランザクション (株式の売買を複数回行う) を完了できます。

  • 株を売却した翌日には株を買うことはできません(凍結期間は1日です)。

: 同時に複数の取引に参加することはできません (再度購入する前に、前の株式を売却する必要があります)。

例 1:

输入: prices = [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]

2. 分析

  1. トピック。この質問と 122 株の売買に最適な時期 II の唯一の違いは、追加の凍結期間があることです。複数回売買することは可能ですが、購入には売却から1日かかり、最大で1株しか保有できません。
  2. dpを導き出します。同様に、毎日には買いの状態と売りの状態という 2 つの状態があり、どちらも前日に関連していますが、売った後に買い続けるには次の日がかかり、dp 配列を推定すると、それぞれの i が導出されます。したがって、購入時にこの凍結期間を直接 2 日早めることができます。
  3. トラバース。表から裏への縦走には前日が必要です。

3. コードとコメント

class Solution {
    
    
    public int maxProfit(int[] prices) {
    
    
        // 1. 两个状态,买入,卖出
        int n = prices.length;
        int[][] dp = new int[n][2];
        if (n == 0 || n == 1) return 0;

        // 2. 由于后面买入的时候需要跨一个冷冻期,i-2,所以前面两天的我们都需要初始化
        dp[0][1] = -prices[0];
        dp[1][0] = Math.max(dp[0][0], dp[0][1] + prices[1]);
        dp[1][1] = Math.max(dp[0][1], dp[0][0] - prices[1]);

        // 3. dp是每个i值都推导,所以我们在买入的时候只需往前计算前2天的即可
        for (int i = 2; 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 - 2][0] - prices[i]);
        }

        return dp[n - 1][0];
    }
}

4. 練習する

トピックへのリンク: 309. 株式の売買に最適な時期には凍結期間が含まれます

おすすめ

転載: blog.csdn.net/qq_51326491/article/details/129344354