传送门:1216F
标签:动态规划
题目大意
你是一名宿舍管理员,在一条直走廊上有n 个连续的房间。房间编号从 1 到 n。你需要将所有n 间房连接到互联网。你可以直接将每个房间连接到互联网,第 i 个房间的费用为i 枚硬币。有些房间有路由器的位置。放置第 i 个房间的路由器的费用也是i 枚硬币。不能在一个没有位置的地方放置路由器。当你在第 i 个房间放置路由器时,你会将号码从max(1,i−k) 到min(n,i+k) 包含在内的所有房间连接到互联网,其中 k 是路由器的范围。所有路由器的 k 值相同。计算将所有n 间房连接到互联网的最低总费用。你可以假设拥有路由器数量大于或等于有路由器位置的房间数量。
输入:第一行包含两个整数 n 和 𝑘——房间的数量和每个路由器的范围。第二行是一个长度为 n 的字符串 s,只包含零和一。如果字符串的第 i 个字符等于 “1”,那么第 i 个房间有一个路由器的位置。如果字符串的第i 个字符等于 “0”,则不能在第 i 个房间放置路由器。
输出:打印一个整数——将所有n 间房连接到互联网的最低总费用。
算法分析
- 设 dp_i 是连接房间 i 到 n-1 所需的总成本(0 编号)。最初 dp_n = 0,所有其他值都是 +∞。如果我们迭代 n-1 到 0 并做出一些转换,最后答案将是 dp_0。
- 第一个转换最容易:用 dp_{i+1} + i + 1 更新 dp_i(直接连接当前房间)。为了进行其他转换,我们需要携带两个集合 mins