[JSOI2016]病毒感染[dp]

Posted fwat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JSOI2016]病毒感染[dp]相关的知识,希望对你有一定的参考价值。

题意

(n?) 个村庄按标号排列,每个村庄有一个死亡速度 (a_i?) 表示每天死 (a_i?) 人(除非你治好这个村庄)。

你从 1 号村庄出发,每天可以选择向相邻的村庄进发或者治愈所在的村庄。

如果在这个过程中你的左边有未治愈的村庄,同时你向左走了一步,那么你需要把这些村庄全部治愈后才能接着自由行动。

求所有村庄都被治愈时最少的死亡人数。

(nle3000,a_ile 10^9)

分析

  • 如果一个村庄不及时救治,代价就是 (|返回的位置 - pos| imes a_{pos}) 。这启发我们枚举返回的位置。

  • 记录 (a) 的前缀和 (s) 定义状态 (f_i) 表示前 (i) 个村庄已经治愈,当前在 (i) 的最小代价。枚举返回位置 (j) ,容易得到:

    [f_i=min{f_j+[j==0](s_n-s_j)+g_{j+1,i}+[i==n](i-j-1)(s_n-s_i)}]

    其中 (g_{j,i}) 表示从 (j) 走到 (i) ,然后走回 (j?) 的最小代价。

  • 枚举 (j) 是否在返回前治愈可以得到:

    [g_{j,i}=g_{j+1,i}+minegin{cases}3a_j(i-j)+(s_n-s_j)+2(s_n-s_i)\2(s_n-s_j)+(s_n-s_i)end{cases}]

    其中 (g_{i,i}=(s_n-s_i)?)

  • 这保证了在转移 (f?) 时,第一个走到的位置时返回后治愈的,如果不是,可以转化为此问题。

  • 时间复杂度 (O(n^2))

代码

代码链接

以上是关于[JSOI2016]病毒感染[dp]的主要内容,如果未能解决你的问题,请参考以下文章

luogu P5774 [JSOI2016]病毒感染 线性 dp

JSOI2016病毒感染

2月第4周网络安全报告:境内69.1万主机感染病毒

一个感染型木马病毒分析

数据结构之病毒感染检测问题

Worm.Win32.Viking.bd病毒怎么解决??急!!