题目链接: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. Linux常用命令大全 --- 文件备份和压缩命令

    在linux中,常用的文件压缩工具有gzip.bzip2.zip . bzip2是最理想的压缩工具,它提供了最大限度的压缩.zip 兼容性好windows也支持 1.bzip2 命令 在shell 提 ...

  2. oo第三单元博客作业

    JML语言理论基础 Java建模语言(Java Modeling Language,JML)是一种进行详细设计的符号语言,他鼓励你用一种全新的方式来看待Java的类和方法.JML是一种行为接口规格语言 ...

  3. 【转】反向AJAX

    原文链接:http://blog.csdn.net/lccone/article/details/7743886 反向Ajax的基本概念是客户端不必从服务器获取信息,服务器会把相关信息直接推送到客户端 ...

  4. Python+selenium鼠标、键盘事件

    鼠标操作 现在的Web产品提供了丰富的鼠标交互方式,例如鼠标右击.双击.悬停.甚至是鼠标拖动等功能,在Webdriver中,将这些关于鼠标操作的方法封装在ActionChains类提供. 1.鼠标右击 ...

  5. 服务器架构及实战(架构篇)- PHP建站

    概述 详解 PHP的环境搭建 PHP的帮助使用和配置文件 PHP的Hello World PHP的库函数调用 PHP的Web程序 PHP的函数和面向对象使用 PHP的数据库访问 Nginx安装和配置访 ...

  6. [luoguP1227] [JSOI2008]完美的对称(sort)

    传送门 排序! #include <cstdio> #include <iostream> #include <algorithm> #define N 20001 ...

  7. 使用Sencha Architect开发Sencha Touch应用的整理

    官网:http://www.sencha.com/ 其实官网上的文档都很清楚了,不过整理一下总比较好 第一步,软件准备 注: 以下软件的安装本着这样两条原则 一是不要安装在中文目录下 二是不要安装在带 ...

  8. NodeJS仿WebApi路由

    用过WebApi或Asp.net MVC的都知道微软的路由设计得非常好,十分方便,也十分灵活.虽然个人看来是有的太灵活了,team内的不同开发很容易使用不同的路由方式而显得有点混乱. 不过这不是重点, ...

  9. csu 1600: Twenty-four point

    传送门 1600: Twenty-four point Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 490  Solved: 78[Submit][S ...

  10. Xcode warning:Auto property synthesis will not synthesize property

    iOS 警告提示如下: 添加 @dynamic告诉编译器这个属性是动态的,动态的意思是等你编译的时候就知道了它只在本类合成; 如下: