题解 | #牛群的最大能量环#
牛群的最大能量环
https://www.nowcoder.com/practice/653d5a6041a04b8cb9b082eeb1429d1c
考察的知识点:动态规划;
解答方法分析:
- 定义变量
ans1用于存储最大能量值。 - 创建一个大小为n的数组
dp1,用于存储最大能量值的动态规划数组。 - 将
ans1初始化为能量列表energy的第一个元素。 - 使用循环遍历能量列表
energy,从下标0开始。 - 如果当前下标
i为0,则将dp1[i]设置为energy[i]。 - 否则,判断上一个状态的最大能量值
dp1[i-1]是否大于等于0,如果是,则将dp1[i]设置为energy[i]加上上一个状态的最大能量值,否则将dp1[i]设置为energy[i]。 - 更新
ans1为dp1[i]和ans1之间的较大值。 - 创建一个大小为n的数组
dp2,用于存储另一种情况下的动态规划数组。 - 定义变量
ans2用于存储另一种情况下的最小能量值。 - 使用循环遍历能量列表
energy,从下标1开始,到n-1结束。 - 将
dp2[i]设置为energy[i]和dp2[i-1]加上energy[i]之间的较小值。 - 更新
ans2为dp2[i]ans2之间的较小值。 - 定义变量
sum用于存储能量列表energy中所有元素的总和。 - 使用循环遍历能量列表
energy,将每个元素加到sum中。 - 返回
ans1和sum - ans2之间的较大值作为结果。
所用编程语言:C++;
完整编程代码:↓
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param energy int整型vector
* @return int整型
*/
int maxEnergyCircular(vector<int>& energy) {
int n = energy.size();
int ans1;
vector<int> dp1(n);
ans1 = energy[0];
for (int i = 0; i < n; i++) {
if (i == 0) {
dp1[i] = energy[i];
} else {
if (dp1[i - 1] >= 0) {
dp1[i] = energy[i] + dp1[i - 1];
} else {
dp1[i] = energy[i];
}
}
ans1 = max(ans1, dp1[i]);
}
vector<int> dp2(n);
int ans2 = 0;
for (int i = 1; i < n - 1; i++) {
dp2[i] = min(energy[i], dp2[i - 1] + energy[i]);
ans2 = min(ans2, dp2[i]);
}
int sum = 0;
for (int i = 0; i< n; i++) {
sum += energy[i];
}
return max(ans1, sum - ans2);
}
};



查看1道真题和解析