NKOJ 1361 帮帮吉米(Help Jimmy)

本文介绍了NKOJ 1361题“帮帮吉米”的解题思路,通过动态规划解决Jimmy从高处下落到地面的最早时间问题。涉及平台排序、状态定义以及使用树状数组处理遮挡问题。
摘要由CSDN通过智能技术生成

话说这道题百度上好像没几个题解,大多数题解又只有代码和少量文字,于是乎我就来水题解了。

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值