我们可以使用动态规划来解决这个问题。
设 $f(i)$ 表示摘下前 $i$ 个桃子后,猴子保留最多的能量值。则 $f(i)$ 有两种情况:
- 从 $f(i-1)$ 转移过来,即猴子从第 $i-1$ 个桃子跳到第 $i$ 个桃子。
- 从 $f(j)$ 转移过来,其中 $j < i$,猴子从第 $j$ 个桃子跳到第 $i$ 个桃子。
根据上述转移方程,可以得到如下代码:
def max_energy(energies):
n = len(energies)
# 初始化 f 数组
f = [0] * (n + 1)
for i in range(1, n + 1):
# 从 f(i-1) 转移过来
f[i] = max(f[i], f[i - 1] + energies[i - 1])
# 从 f(j) 转移过来
for j in range(i):
f[i] = max(f[i], f[j] + energies[j] - (i - j))
return f[n]
时间复杂度:$O(n^2)$