话说这道题百度上好像没几个题解,大多数题解又只有代码和少量文字,于是乎我就来水题解了。
Description
“Help Jimmy” 是在下图所示的场景上完成的游戏。
景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。
当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。
当Jimmy跑到平台的边缘时,开始继续下落。
Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算Jimmy到底地面时可能的最早时间。
Input Format
第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐标,MAX是一次下落的最大高度。
接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]和X2[i]表示平台左右端点的横坐标。
1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0<H[i]< Y <= 20000(i = 1…N)。所有坐标的单位都是米。
Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。
Output Format
输出一个整数,Jimmy到底地面时可能的最早时间。
Sample Input 1
3 8 17 20
0 10 8
0 10 13
4 14 3
Sample Output 1
23
Sample Input 2
10 899 52 50
893 903 18
890 900 38
898 908 8
910 920 8
894 904 43
881 891 18
872 882 38
867 877 43
842 852 43
895 905 3
Sample Output 2
61
看到这道题理所当然想到了爆搜,搜索当前jimmy所在的位置(平台),时间复杂度 O ( 2 N ) O(2^N) O(2N),然而我们看到高达一千的数据范围,就差那么亿点点了。。。
然后立马想到了动态规划(别问我为什么,一个OIer只要有点经验就会想到动态规划吧QAQ)。
我们令 a i a_i ai 表示平台 i i i, a i . l a_i.l ai.l 表示平台的左端点, a i . r a_i.r ai.r 表示平台的右端点, a i . h a_i.h ai.h 表示平台的高度。
按照高度给平台排序是必须的,重点在于状态定义。
显然我们不可能将jimmy在平台的每个位置的情况都考虑一遍,只用考虑吉姆在平台的左端点和右端点的情况即可,因为如果是在平台的中间,一定要走到这两个地方才能继续下落。
设 d i d_i di 表示吉姆在平台 i i i 的左端点时落到地面所需要的最短时间, d 2 i d2_i d2i 表示吉姆在平台 i i i 的左端点时落到地面所需要的最短时间。
依次考虑高度比这个平台低的所有平台即可。
当可以从一个端点跳到另一个平台上时,就可以进行计算了。
所以说状态转移方程为:
d [ i