超級飲料的最大強化能量
題目
來自未來的體育科學家給你兩個整數陣列 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])