📅  最后修改于: 2023-12-03 15:10:35.139000             🧑  作者: Mango
在一个由 $n$ 个房间组成的房间列表中,每个房间都有一个整数 $c$ 表示该房间拥有的巧克力数目。你作为一个贪心的小孩,希望从这些房间中,选取其中的若干个房间,使得你收到的巧克力总数尽可能的多,同时你不能进入相邻的两个房间,不然你拿不到巧克力了。
现在,请你设计一个算法,计算一下你最多能收到多少巧克力。
这是一道典型的动态规划问题。设 $f[i]$ 表示到第 $i$ 个房间时,你最多能收到的巧克力总数,则状态转移方程为:
$$ f[i] = \max { f[i-1], f[i-2]+c_i } $$
其中,$c_i$ 表示第 $i$ 个房间中的巧克力数。意思是,你可以选择不进入第 $i$ 个房间,那么你的最优策略就是到第 $i-1$ 个房间时所拥有的巧克力总数;或者你可以进入第 $i$ 个房间,那么你的最优策略就是到第 $i-2$ 个房间时所拥有的巧克力总数加上第 $i$ 个房间中的巧克力数。
最后,答案为 $f[n]$,即到最后一个房间时所能得到的最多巧克力数。
def max_chocolates(chocolates):
n = len(chocolates)
f = [0]*n
for i in range(n):
if i == 0:
f[i] = chocolates[i]
elif i == 1:
f[i] = max(chocolates[:2])
else:
f[i] = max(f[i-1], f[i-2]+chocolates[i])
return f[-1]
chocolates = [1, 2, 3, 1]
print(max_chocolates(chocolates)) # 返回 4
chocolates = [2, 7, 9, 3, 1]
print(max_chocolates(chocolates)) # 返回 12
以上代码实现和测试样例均可以在 LeetCode 上进行验证。