题目链接:http://poj.org/problem?id=1661

Help Jimmy
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 12537   Accepted: 4160

Description

"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

Source

 
 
 
题解:
1.设dp[i][0]为到达平台i左端的最短时间, dp[i][1]为到达平台i右端的最短时间。
2.对于平台i,如果从左边跳下去,那么人能到达离此平台最近的且能降落到的平台(一端最多只能到达一个平台,最开始没注意到)。
 
 
 
代码如下:
 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
#define ms(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const double EPS = 1e-;
const int INF = 2e9;
const LL LNF = 2e18;
const int MAXN = 1e3+; struct node
{
int l, r, h;
bool operator<(const node &x) const{
return h>x.h;
}
}a[MAXN];
int dp[MAXN][]; int main()
{
int T, n, x, y, mh;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%d%d", &n,&x,&y,&mh);
for(int i = ; i<=n; i++)
scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].h);
a[++n].l = a[n].r = x; a[n].h = y; sort(a+, a++n);
for(int i = ; i<=n; i++)
dp[i][] = dp[i][] = INF; int ans = INF;
dp[][] = dp[][] = ;
for(int i = ; i<=n; i++)
{
if(dp[i][]==INF) continue;
bool left = false, right = false; //左边或右边最多只能跳到一个平台上,且是距离最近的
for(int j = i+; j<=n; j++)
{
int dis_h = a[i].h - a[j].h;
if(dis_h>mh) break;
if(!left && a[j].l<=a[i].l && a[i].l<=a[j].r ) //从左边跳下去
{
left = true;
dp[j][] = min(dp[j][], dp[i][] + dis_h + a[i].l-a[j].l);
dp[j][] = min(dp[j][], dp[i][] + dis_h + a[j].r-a[i].l);
}
if(!right && a[j].l<=a[i].r && a[i].r<=a[j].r ) //从右边跳下去
{
right = true;
dp[j][] = min(dp[j][], dp[i][] + dis_h + a[i].r-a[j].l);
dp[j][] = min(dp[j][], dp[i][] + dis_h + a[j].r-a[i].r);
} if(left && right) break;
} if(a[i].h<=mh) //如果此平台可以跳到地面上, 则更新答案
{
if(!left) ans = min(ans, dp[i][]+a[i].h);
if(!right) ans = min(ans, dp[i][]+a[i].h);
}
} printf("%d\n", ans);
}
}

POJ1661 Help Jimmy —— DP的更多相关文章

  1. kuangbin专题十二 POJ1661 Help Jimmy (dp)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14214   Accepted: 4729 Descr ...

  2. POJ-1661-Help Jimmy(DP, 递推)

    链接: https://vjudge.net/problem/POJ-1661 题意: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同 ...

  3. POJ 1661 Help Jimmy DP

    思路:Jimmy 跳到一块板上后,可以有两种选择,向左走或向右走.走到左端和走到右端所需的时间,容易算出. n如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左 ...

  4. POJ 1661 Help Jimmy(DP,注意边界)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9399   Accepted: 3025 Descri ...

  5. 【动态规划】POJ1661 Help Jimmy

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11621   Accepted: 3827 Descr ...

  6. Help Jimmy DP

    Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...

  7. M - Help Jimmy DP

    "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某 ...

  8. POJ1661 Help Jimmy

    Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9863 Accepted: 3201 Descriptio ...

  9. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

随机推荐

  1. Google JavaScript代码风格指南

    Google JavaScript代码风格指南 修正版本 2.28 Aaron Whyte Bob Jervis Dan Pupius Eric Arvidsson Fritz Schneider R ...

  2. Exact Change(01背包)

    描述 Seller: That will be fourteen dollars. Buyer: Here's a twenty. Seller: Sorry, I don't have any ch ...

  3. centos7安装rlwrap

    http://utopia.knoware.nl/~hlub/uck/rlwrap/ 下载rlwrap-0.42.tar.gz 找到centos7 安装的iso中的 Packages的 ncurses ...

  4. 机器学习基础-Logistic回归1

    利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类. 训练分类器时的做法就是寻找最佳拟合参数,使用的时最优化算法. 优点:计算代价不高,利于理解和实现. ...

  5. hdu4135 Co-prime【容斥原理】

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  6. PHP错误处理函数set_error_handler()的用法[转载]

    定义和用法 set_error_handler() 函数设置用户自定义的错误处理函数. 该函数用于创建运行时期间的用户自己的错误处理方法. 该函数会返回旧的错误处理程序,若失败,则返回 null. 语 ...

  7. poj1459多源多汇最大流问题

    /*基本构图题,多源多汇,添加一个源点和一个汇点,所有源点都来自这个源点,同理,所有汇点 都汇于这个汇点,dinic第二战,本来应该1A的,犯了一个低级错误!while(scanf("%d) ...

  8. Django学习之 - 基础路由系统

    路由系统:URL 1:一个URL对应一个类或函数: url(r'^register',reg.register) 函数写法 url(r'^cbv',reg.cbv.as_view()) 类写法 2:通 ...

  9. POJ 2502 【思维是朴素的最短路 卡输入和建图】

    题意: 给出两个坐标,分别是小明家和小明学校的坐标. 给出多条地铁线,给出每站的坐标,已知地铁是双向的,每条线以-1 -1结尾. 给出地铁速度,步行速度. 地铁线可看成是顺次连接的线段. 求小明从家到 ...

  10. Java面试题总结之OOA/D,UML,和XML

    全文字数:   2732 阅读时间:   大约9 分钟 1.UML 是什么?常用的几种UML图? 统一建模语言(Unified Modeling Language,UML)又称标准建模语言:常用图包括 ...