考察的知识点:动态规划;
解答方法分析:
- 定义变量
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); } };