【每日题解】3259. 超级饮料的最大强化能量

来自未来的体育科学家给你两个整数数组 energyDrinkA 和 energyDrinkB,数组长度都等于 n。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。

你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。

返回在接下来的 n 小时内你能获得的 最大 总强化能量。

注意 你可以选择从饮用任意一种能量饮料开始。

示例 1:

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

输出:5

解释:

要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)。

示例 2:

输入:energyDrinkA = [4,1,1], energyDrinkB = [1,1,3]

输出:7

解释:

  • 第一个小时饮用能量饮料 A。
  • 切换到能量饮料 B ,在第二个小时无法获得强化能量。
  • 第三个小时饮用能量饮料 B ,并获得强化能量。

思路

根据题目的描述,很自然的选择采用动态规划的思想解决本题。递归三部曲:

  • dpA[i] 表示在第 i 小时饮用 A 饮料的最大能量,dpB[i] 表示在第 i 小时饮用 B 饮料的最大能量
  • 初始条件:dpA[0] = A[0],dpB[0] = B[0]
  • 状态转移方程:dpA[i] = max(dpA[i-1] + A[i], dpB[i-2] + A[i]),dpB[i]同理

最终答案的返回结果为 max(dpA[n-1], dpB[n-1])

代码(C++)

class Solution {
public:
    long long maxEnergyBoost(vector<int>& energyDrinkA, vector<int>& energyDrinkB) {
        int n = energyDrinkA.size();
        vector<long long> dpA(n+1, 0), dpB(n+1, 0);
        dpA[0] = energyDrinkA[0];
        dpA[1] = energyDrinkA[1] + dpA[0];
        dpB[0] = energyDrinkB[0];
        dpB[1] = energyDrinkB[1] + dpB[0];
        for (int i = 2; i < n; ++i) {
            dpA[i] = std::max(dpA[i-1] + energyDrinkA[i], dpB[i-2] + energyDrinkA[i]);
            dpB[i] = std::max(dpB[i-1] + energyDrinkB[i], dpA[i-2] + energyDrinkB[i]);
        }
        return std::max(dpA[n-1], dpB[n-1]);
    }
};

代码(Python)

class Solution:
    def maxEnergyBoost(self, energyDrinkA: List[int], energyDrinkB: List[int]) -> int:
        n = len(energyDrinkA)
        dpA, dpB = n * [0], n * [0]
        dpA[0] = energyDrinkA[0]
        dpA[1] = dpA[0] + energyDrinkA[1]
        dpB[0] = energyDrinkB[0]
        dpB[1] = dpB[0] + energyDrinkB[1]
        for i in range(2, n):
            dpA[i] = max(dpA[i-1] + energyDrinkA[i], dpB[i-2] + energyDrinkA[i])
            dpB[i] = max(dpB[i-1] + energyDrinkB[i], dpA[i-2] + energyDrinkB[i])
        return max(dpA[n-1], dpB[n-1])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值