[BZOJ1571][Usaco2009 Open]滑雪课Ski
比较水的动规。
注意到这题主要的变量就是时间和能力值,而且时间能力值<=10000100,因此空间上能够承受二维的状态。
用f[i, j]表示在第i时刻,能力值为j的情况下,所能滑的最大距离。
每一天最多有三种事情可以做:喝果汁、滑雪,有时还可以上课。- 如果喝果汁的话,那么可以直接从f[i, j]转移到f[i+1, j]
- 如果滑雪的话,显然我们要滑当前能力值能滑的最短的雪道,因为越短所需的时间越少,而且就算有零星的时间没法用到,也可以通过喝果汁解决。转移方法:f[i, j]+1转移到f[i+pre[j], j],其中pre[j]为能力值j能滑的雪道中最短的长度。
- 如果当前这个时刻有一门课程的话,那么我们得考虑学习是否更优。注意:同一个时刻可能有多门课程!转移方法:f[i, j]转移到f[i+L[k], A[k]],其中L[k]、A[k]分别为当天某个课程的学习时间和能力值
怎么计算pre[j]呢?
主程序的复杂度达到了O(t(s+100)),那么预处理采用O(n100)的朴素做法也未尝不可。当然也可以双关键字排序+线性扫描,快不了多少,而且写起来麻烦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|