1 条题解
-
0
题目理解
-
有 个小镇在一条直线上,编号 ,JYY 从 出发。
-
每个小镇 初始有 个患者。
-
每天 JYY 可以:
- 治愈当前村庄的所有患者(这一天该村无人死亡)。
- 移动到相邻村庄。
-
如果某天开始时村庄 有 个患者(且未被治愈),那么当天结束时会死亡 人(即患者数翻倍前死亡 人?实际上是:每天患者会感染 个健康村民并死去,所以每天死亡 人,因为初始患者数固定为 ,直到被治愈)。
注意:死亡人数是按天算的,每天每个未治愈的村庄固定死 人,不是按当前患者数翻倍,而是每天固定死 人(因为题目说“对于 i 号村庄,只要这个村庄没有被 JYY 彻底消灭疫情,那么每一天都会有 a_i 个村民死去”)。这意味着每个村庄的死亡人数只取决于它被治愈的时间(从开始到治愈的那一天数)。
-
行程限制:如果 JYY 经过某个村庄 但没治愈,之后如果 JYY 从 到 且 (即朝 的方向走了一步),那么之后必须一直朝 走直到治愈 ,中途可以治愈经过的村庄。
问题转化
我们要安排 JYY 的行程,使得所有村庄都被治愈,并且总死亡人数最少。
总死亡人数 = ,其中 是村庄 从开始到被治愈所经过的天数(不包括治愈当天,因为治愈当天无人死亡)。
更准确地说:
- 村庄 在第 天被治愈。
- 那么它会在第 天每天死 人。
- 所以总死亡人数 = 。
目标是最小化 。
行程限制的影响
限制条件意味着:一旦 JYY 在某个村庄 未治愈并离开,之后如果朝 的方向走了一步,就必须连续走到 并治愈它,中途不能改变方向。
这实际上是一种“承诺”机制:不能给村民希望又让他们失望。
动态规划思路
这是一个区间 DP 问题。
设 表示治愈区间 的所有村庄,并且最后 JYY 停在左端点 (0)或右端点 (1)时,该区间内的村庄产生的最小死亡代价(只考虑这些村庄的死亡天数,但天数计算要考虑全局时间)。
但是天数与访问顺序有关,我们需要知道在治愈这个区间之前已经过了多少天,因为死亡是按天累积的。
更好的状态设计(常见于这类“关灯”、“治病”问题):
- 设 表示治愈区间 的所有村庄,并且此时其它未治愈的村庄已经产生的死亡天数 = 区间长度)。
已知经典模型:在一条直线上从起点 出发,要处理所有村庄,可以设计: 表示已经治愈 ,当前在 或 ,从开始到此刻的总死亡人数。
转移时,考虑从 扩展到 或 ,新治愈的村庄的死亡天数 = 当前已用天数 + 移动时间。
初始化:(治愈村庄 1 在第 1 天,死亡 0)。
但这里起点固定为 1,所以 才可能。
更精确地,我们令 表示当前在 ,已经治愈了 区间,所花费的总死亡代价。
表示当前在 ,已经治愈了 区间。转移:
- 从 可以走到 ,花费 1 天,此时所有未治愈的村庄(即 )都会产生 的死亡?不,是所有未治愈村庄的 之和,因为每个未治愈村庄死 人/天。
设 ,。
那么未治愈的村庄的 之和 = 。
所以: 从 到 : $dp[l-1][r][0] = \min(\dots, dp[l][r][0] + (S - s[l][r]))$,因为移动一天,所有未治愈村庄死 人。
从 到 (不可能,因为 已治愈, 未治愈,但当前在 ,要去 必须经过 ,但 已治愈,所以可以直接扩展?实际上要检查限制条件)。
限制条件在 DP 中自动满足,因为我们不会在未治愈的村庄上“掉头”而不立即治愈它——我们的状态是连续治愈的区间,所以不会出现未治愈的村庄在区间内部的情况。
因此,这实际上就是经典的“关灯”问题(POJ 1222 扩展),在一条链上,起点固定,每次移动一天,每天所有未关的灯会产生代价,求最小总代价。
最终算法
状态: 表示治愈了区间 ,当前在 (0)或 (1),所花费的最小总死亡代价。
转移:
- 可以从 $dp[l+1][r][0] + (S - s[l+1][r]) \times (pos_{l+1} - pos_l)$ 转移(移动时间 = 距离,因为相邻村庄距离 1)。 也可以从 $dp[l+1][r][1] + (S - s[l+1][r]) \times (pos_r - pos_l)$ 转移。
- 可以从 $dp[l][r-1][1] + (S - s[l][r-1]) \times (pos_r - pos_{r-1})$ 转移, 也可以从 $dp[l][r-1][0] + (S - s[l][r-1]) \times (pos_r - pos_l)$ 转移。
初始化:。
答案:。
注意:这里 (位置就是编号),所以 。
因此转移简化为:
$dp[l][r][0] = \min(dp[l+1][r][0] + (S - s[l+1][r]),\ dp[l+1][r][1] + (S - s[l+1][r]) \times (r - l))$
$dp[l][r][1] = \min(dp[l][r-1][1] + (S - s[l][r-1]),\ dp[l][r-1][0] + (S - s[l][r-1]) \times (r - l))$
其中 ,。
复杂度
,满足 。
-
- 1
信息
- ID
- 4842
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者