超級飲料的最大強化能量

侯佳奇發表於2024-11-01

超級飲料的最大強化能量

題目

來自未來的體育科學家給你兩個整數陣列 energyDrinkA 和 energyDrinkB,陣列長度都等於 n。這兩個陣列分別代表 A、B 兩種不同能量飲料每小時所能提供的強化能量。

你需要每小時飲用一種能量飲料來 最大化 你的總強化能量。然而,如果從一種能量飲料切換到另一種,你需要等待一小時來梳理身體的能量體系(在那個小時裡你將不會獲得任何強化能量)。

返回在接下來的 n 小時內你能獲得的 最大 總強化能量。

注意 你可以選擇從飲用任意一種能量飲料開始。

示例 1:

輸入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]

輸出:5

解釋:

要想獲得 5 點強化能量,需要選擇只飲用能量飲料 A(或者只飲用 B)。

分析

這是個二維陣列動態規劃問題, d[i][0/1]表示i+1小時喝A/B能獲得的最大能量

那麼

d[i][0] = max([d[i-1][0], d[i-2][1]]) + energyDrinkA[i]
d[i][1] = max([d[i-1][1], d[i-2][0]]) + energyDrinkB[i]

結果返回max([d[n-1][0], d[n-1][1]])

class Solution:
    def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int:
        # 設d[i][0/1]表示第i天從A或者B取。
        # d[i][0] = max([d[i-1][0], d[i-2][1]]) + A[i]
        # d[i][1] = max([d[i-1][1], d[i-2][0]]) + B[i]
        n = len(energyDrinkA)
        d = [[0, 0] for _ in range(n)]
        d[0][0] = energyDrinkA[0]
        d[0][1] = energyDrinkB[0]

        for i in range(1, n):
            d[i][0] = max([d[i-1][0], d[i-2][1]]) + energyDrinkA[i]
            d[i][1] = max([d[i-1][1], d[i-2][0]]) + energyDrinkB[i]

        return max(d[n-1])

相關文章