Help Jimmy


Descriptions:

"Help Jimmy" 是在下图所示的场景上完成的游戏。

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。

Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。

设计一个程序,计算Jimmy到底地面时可能的最早时间。


Input

第一行是测试数据的组数t(0 <= t <= 20)。每组测试数据的第一行是四个整数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

对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。


Sample Input

1

3 8 17 20

0 10 8

0 10 13

4 14 3

Sample Output

23

题目链接:

https://vjudge.net/problem/POJ-1661

动态规划,从下往上找,dp[i][2]中dp[i][0]表示第i个平台最左边到底的最短时间,dp[i][1]表示平台最右边到底的最短时间。

状态转移方程:dp[i][1]=a[i].h-a[k].h+min(dp[k][0]+a[i].x2-a[k].x1,dp[k][1]+a[k].x2-a[i].x2);//右

       dp[i][0]=a[i].h-a[k].h+min(dp[k][0]+a[i].x1-a[k].x1,dp[k][1]+a[k].x2-a[i].x1);   //左

AC代码

 #include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <numeric>
const int INF=0x3f3f3f;//无穷大
using namespace std;
typedef long long ll;
int T;
int N,X,Y,MAXH;
//0表示第i个平台最左边到底的最短时间
//1表示第i个平台最右边到底的最短时间
int dp[][];
struct node
{
int x1,x2,h;
};
bool cmp(node a,node b)//根据h从大到小排列
{
return a.h>b.h;
}
node a[];
void LeftTime(int i)//左
{
int k=i+;
while(k<N+&&a[i].h-a[k].h<=MAXH)
{
if(a[i].x1>=a[k].x1&&a[i].x1<=a[k].x2)
{
dp[i][]=a[i].h-a[k].h+min(dp[k][]+a[i].x1-a[k].x1,dp[k][]+a[k].x2-a[i].x1);
return;
}
k++;
}
if(a[i].h-a[k].h>MAXH)//不能到达下一平台
dp[i][]=INF;
else//直接落地
dp[i][]=a[i].h; return;
}
void RightTime(int i)//右
{
int k=i+;
while(k<N+&&a[i].h-a[k].h<=MAXH)
{
if(a[i].x2>=a[k].x1&&a[i].x2<=a[k].x2)
{
dp[i][]=a[i].h-a[k].h+min(dp[k][]+a[i].x2-a[k].x1,dp[k][]+a[k].x2-a[i].x2);
return; }
k++;
}
if(a[i].h-a[k].h>MAXH)//不能到达下一平台
dp[i][]=INF;
else//直接落地
dp[i][]=a[i].h; return;
}
int main()
{
cin >> T;
while(T--)
{
memset(dp,,sizeof(dp));
a[].x1=-,a[].x2=,a[].h=;//大地
cin >> N>>X>>Y>>MAXH;
a[].x1=X,a[].x2=X,a[].h=Y;//初始位置
for(int i=; i<=N+; i++)
{
cin >> a[i].x1 >> a[i].x2 >> a[i].h;
}
sort(a,a+N+,cmp);
for(int i=N; i>=; i--)
{
LeftTime(i);//左
RightTime(i);//右
}
int MinTime=min(dp[][],dp[][]);
cout << MinTime <<endl;
}
return ;
}

【POJ - 1661】Help Jimmy (动态规划)的更多相关文章

  1. POJ 1661 Help Jimmy -- 动态规划

    题目地址:http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度 ...

  2. POJ 1661 Help Jimmy(C)动态规划

    没刷过 POJ,这题是论坛有人问的,我才看看. 我发现 POJ 注册很奇怪,账号总是登不上去,弄的我还注册两个.Emmm 首次体验很差,还好我不在 POJ 刷题. 题目链接:POJ 1661 Help ...

  3. POJ 1661 Help Jimmy(递推DP)

    思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...

  4. OpenJudge/Poj 1661 帮助 Jimmy

    1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...

  5. POJ 1661 Help Jimmy(DP/最短路)

    Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14980 Accepted: 4993 Descripti ...

  6. POJ 1661 Help Jimmy(二维DP)

    题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...

  7. POJ - 1661 - Help Jimmy - 简单dp

    http://poj.org/problem?id=1661 一般化处理,把一开始的落地和大地都视作平台,设计平台类的属性.dp的时候显然是从上往下dp的,而且要小心Jimmy不能够穿过平台,也就是从 ...

  8. POJ 1661 Help Jimmy【DP】

    基础DP,过程想明白了其实也不复杂,从上面的推下面的比倒着推要简单很多.调试了半个多小时..简单dp依然不能快速AC..SAD.. 题目链接: http://poj.org/problem?id=16 ...

  9. POJ 1661 Help Jimmy LIS DP

    http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...

  10. POJ 1661 Help Jimmy (dijkstra,最短路)

    刚在百度搜索了一下这道题的题解, 因为看到有别人用动态规划做的,所以想参考一下. 结果顺带发现了有那么几个网站,上面的文章竟然和我这篇一模一样(除了一些明显的错别字外),我去,作者还是同一个人Admi ...

随机推荐

  1. <项目><day12>通讯录(视频)

    1 需求分析(需求分析师) 功能分析: 1)添加联系人 2)修改联系人 3)删除联系人 4)查询所有联系人 2 需求设计(系统分析师/架构师/资深开发人员) 2.1设计实体(抽象实体) 联系人实体: ...

  2. ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解

    转自 ArcEngine中IFeatureClass.Search(filter, Recycling)方法中Recycling参数的理解   ArcGIS Engine中总调用IFeatureCla ...

  3. 使用Spring定时任务并且通过AOP监控任务执行情况

    原文:http://www.open-open.com/code/view/1426250803279 本文讲的是通过Spring注解的方式实现任务调度.只要引入了spring-context包就能够 ...

  4. Nexus搭建Maven私有仓库

    原文:http://blog.csdn.net/rickyit/article/details/54927101 前言 Nexus Repository Manager is a Javaapplic ...

  5. LINUX下安装和配置WEBLOGIC10.0.3

    weblogic for linux安装 首先声明,我参考了某位原创者的笔记,加以整理的.安装1. 安装前的准备工作1.1 首先请确认您要安装的Weblogic版本所在的平台已通过了BEA的认证,完整 ...

  6. O2O助汪峰成功逆袭,汪峰最终上头条了

    8月2日七夕情人节,汪峰<峰暴来临>演唱会在鸟巢10万人体育场唱响,各大报纸.站点娱乐板块并没有等来汪峰向国际章求婚的"头条",只是,与乐视合作现场演出+付费直播的O2 ...

  7. 为Java说句公道话

    为Java说句公道话 有些人问我,在现有的语言里面,有什么好的推荐?我说:"Java. " 他们非常吃惊:"什么?Java!" 所以我如今来解释一下. Java ...

  8. asp.net mvc 抓取京东商城分类

    555 asp.net mvc 抓取京东商城分类   URL:http://www.jd.com/allSort.aspx   效果:   //后台代码 public ActionResult Get ...

  9. 【C#】无损转换Image为Icon 【C#】组件发布:MessageTip,轻快型消息提示窗 【C#】给无窗口的进程发送消息 【手记】WebBrowser响应页面中的blank开新窗口及window.close关闭本窗体 【手记】调用Process.EnterDebugMode引发异常:并非所有引用的特权或组都分配给呼叫方 【C#】DataRowState演变备忘

    [C#]无损转换Image为Icon 如题,市面上常见的方法是: var handle = bmp.GetHicon(); //得到图标句柄 return Icon.FromHandle(handle ...

  10. List<Guid?> a = new List<Guid?>();

    正常写法 泛型 类型 为 Guid? List<Guid?> a = new List<Guid?>(); Guid? b = null; Nullable<Guid&g ...