以下是该题目的要求以及输入输出:
来自未来的体育科学家给你两个整数数组 energyDrinkA
和 energyDrinkB
,数组长度都等于 n
。这两个数组分别代表 A、B 两种不同能量饮料每小时所能提供的强化能量。
你需要每小时饮用一种能量饮料来 最大化 你的总强化能量。然而,如果从一种能量饮料切换到另一种,你需要等待一小时来梳理身体的能量体系(在那个小时里你将不会获得任何强化能量)。
返回在接下来的 n
小时内你能获得的 最大 总强化能量。
注意 你可以选择从饮用任意一种能量饮料开始。
输入:energyDrinkA = [1,3,1], energyDrinkB = [3,1,1]
输出:5
解释:
要想获得 5 点强化能量,需要选择只饮用能量饮料 A(或者只饮用 B)
这道题目类似于背包问题,我们可以构建俩个背包,但是这俩个背包是有无穷大容量的,只要达到最终能量最大即可。然后后面我们就可以用动态规划的想法的不断的遍历输入的俩个数组来利用前面求出来的子问题来得到最终的最优解了,以下是该题的一个代码:
long long maxEnergyBoost(vector<int>& energyDrinkA, vector<int>& energyDrinkB) {
int n = energyDrinkA.size();
vector<long long> dp1(n);//创建俩个背包dp1和dp2
vector<long long> dp2(n);
dp1[0] = energyDrinkA[0];//初始化俩个背包,因为只能选第一个,所以最大的取值也是选第一个
dp2[0] = energyDrinkB[0];
for(int i = 1;i<n;i++){
if(i==1){
dp1[i] = dp1[i-1]+energyDrinkA[i];//如果能够选俩个饮料,仍然通过各自数组进行维和,因为如何转换数组优化需要消耗(一个小时)。
dp2[i] = dp2[i-1]+energyDrinkB[i];
}else{
dp1[i] = max(dp2[i-2]+energyDrinkA[i],dp1[i-1]+energyDrinkA[i]);//当可选的饮料达到了3个以上就可以利用另一个数组来优化自己的背包的能量了,这里分了俩种情况,首先第一种就是不选另一个数组的饮料;另一种情况就是选另一个数组的能量,从中取最大值。
dp2[i] = max(dp1[i-2]+energyDrinkB[i],dp2[i-1]+energyDrinkB[i]);
}
}
return max(dp1[n-1],dp2[n-1]);//最后返回俩个维护的背包能量的最大值进行返回
}
以上就是每日一题的解答。