📜  门|门CS 2011 |问题 9(1)

📅  最后修改于: 2023-12-03 15:12:47.454000             🧑  作者: Mango

题目描述

题目来源于 2011 年国家集训队的 CS 题,问题 9。

有$n(n\leq1e5)$个房间排成一排,每个房间有一把钥匙可以打开相邻的两个房间(第一个房间没有钥匙)。开始时,除第一个房间外,其他每个房间可能已经被锁定。每个房间有一个价值$w_{i}(0\leq w_{i}\leq10^5)$,其中第一个房间的价值为$0$。现在你可以使用钥匙来打开一些房间,每一个房间只能使用一次。当你打开一个已经锁定的房间时,你可以获得它的价值$w_{i}$。现在请你求出在所有方案中,最大化获得的总价值。

思路分析

题目是一个比较典型的 DP 问题。可以设计状态 $f_i$ 表示到第 $i$ 个房间为止所能收集到的最大价值。状态转移方程为:

$$f_i = \max{f_{i-1}, f_{i-2}+w_i}$$

其中,$f_{i-1}$ 表示不打开第 $i$ 个房间的情况,$f_{i-2}+w_i$ 表示打开第 $i$ 个房间的情况。

为了使得状态计算完整,需要在数组前面添加一个 $0$ 。因此状态转移方程中 $f_0=0$ 。

代码片段:

n = int(input())
w = [0] + list(map(int, input().split()))
f = [0] * (n+1)
for i in range(2, n+1):
    f[i] = max(f[i-1], f[i-2]+w[i])
print(f[n])
总结

这道题目的思路比较简单,考虑边界条件以及设计状态转移方程即可。注意初始化时,需要为状态数组 $f$ 中的每个位置赋值为 $0$ 。

最终的结果为 $f_n$ ,其中 $n$ 表示房间数。