A.凑硬币问题
略.
B.青蛙过河
略.
C.守望者的逃离
设 (f_i) 表示第 (i) 个时刻最远到达哪里
跑步和瞬移不方便一起转移,考虑分开:
- 瞬移:显然,如果只有瞬移操作,那么尽量使用瞬移,直到 (m) 不够的时候补 (m),有:
if(m>=10) f[i]=f[i-1]+60,m-=10;
else f[i]=f[i-1],m+=4;
- 跑步:可以考虑对于第 (i) 秒,可以从 (i-1) 秒加上 (1s) 的跑步时间转移而来,有:
(f_i=max { f_i,f_{i-1}+17 })
D.最大子段和
模板题,略
E.聚猪淘气
思想很简单:
设当前分组到 (i) 的最大组数为 (f_i),每次若 (sum(1,i) geq 0),则初始化 (f_i=1),考虑枚举当前这一组的起始点 (j+1),有:
(f_i=maxlimits_{j=1}^i { f_j+1 }(sum(j+1,i) geq 0))
式子里的那个 (sum) 可以用前缀和优化一下,总复杂度 (O(n^2))
照着这个柿子直接上可以拿到 (30pts) 的好成绩
所以这个柿子有什么问题?
注意到 (i) 的合法性是建立在 (j) 合法之上的,那么每次转移之前,我们需要判断 (j) 是否合法,即 (f_j > 0)
F.堆放核材料
设当前放到第 (i) 个坑的合法总方案数是 (f_i),有:
- (f_i=2 imes f_{i-1} (i < m))
- (f_i=2 imes f_{i-1} -1 (i = m))
- (f_i=2 imes f_{i-1} - f_{i-m-1} (i > m))
G.佩奇的任务
由于出现了时间,容易想到这是一个有关时间的线性 dp
设(f_i) 表示 (1)~(i) 的最大空闲时间,
但是,第 (i) 时刻的最大空闲时间是和后面(第 (i) 时刻加上 (i) 时刻选择的任务的持续时间)的时刻有关系的,因此 (f_i) 与前面无关,与后面有关,于是设 (f_i) 表示 (i)~(n) 的最大空闲时间,此时从后往前转移,状态转移方程如下:
- 当此时刻没有任务时,空闲时间为上一时刻的空闲时间(+1):(f_i=f_{i+1}+1)
- 当此时刻有任务,则枚举此时刻每个任务 (num) 的持续时间 (a_num),找出哪个任务使得空闲时间最大化:(f_i=max{f_i,f_{i+a_{num}} })
1 判定此时刻是否有任务,可以通过开桶
2 由于从后往前搜索,因此 (num) 的时间顺序也应当从后往前,从大到小排序(同时也将相同开始时间的任务放到一起),当此时刻任务进行判定时,对应的任务数 (s_i) 与 (num) 需要进行相应变化。
H.登山队伍
模板题,略
I.导弹拦截
题面被 zez 魔改了一发
附上原题题面:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:
虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达
捕捉到敌国的导弹来袭。
请你计算出,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
如果下一个高度 (a_j > a_i) 则该导弹必定不能被当前导弹系统命中,导弹系统的个数需要增加一个
所以该问题变成了典型的求最长上升子序列LCS问题,直接 dp 即可
J.猪猪速度
考虑将 (w) 看做下标,直接dp即可