POJ 1661 Help Jimmy(二维DP)
题目链接:http://poj.org/problem?id=1661
题目大意:

如图包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的某处(高H处)开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算Jimmy到底地面时可能的最早时间。
解题思路:根据题意易得无论如何都要下落H的高度,所以可以不用计算下落高度所需时间,直接计算水平走的最短时间最后加上高度即可,按平台高度从高到低排序,建立二维数组,dp[i][0]表示第i个平台往左走到达地面的最短水平时间,dp[i][1]表示第i个平台往右走到达地面的最短水平时间,于是有状态转移方程:
dp[i][0]=min(dp[j][0]+a[i].x1-a[j].x1,dp[j][1]+a[j].x2-a[i].x1), j是i左边下面的落点平台编号。
dp[i][1]=min(dp[j][1]+a[j].x2-a[i].x2,dp[j][0]+a[i].x2-a[j].x1),j是i右边下面的落点平台编号。
所以直接自底向上递推,每次往左或往右找到第一个落点平台计算最少时间,最后推到i=0(起始点)就可以了。
要注意一下①初始化dp为inf,dp[0][1]和dp[0][0]也要初始化为inf。
②找到第一个可掉落的平台计算之后,就break,不然会把下面几个平台都算进去。
③判断当找不到落点平台时,可能有三种情况:
1)所在平台高度小于等于MAX,但下面没有平台
2)下面有平台,但两平台高度差大于MAX
3)下面没有平台,且所在平台高度大于MAX
特判情况1),此时dp[i][0](或dp[i][1])为0
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e3+;
const int inf=<<; struct node{
int x1,x2,h;
}a[N]; int dp[N][];//从第i层0往左,1往右 bool cmp(node a,node b){
return a.h>b.h;
} int main(){
int T;
scanf("%d",&T);
while(T--){
int n,X,H,MAX;
scanf("%d%d%d%d",&n,&X,&H,&MAX);
for(int i=;i<=n;i++){
scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].h);
dp[i][]=dp[i][]=inf;
}
sort(a+,a++n,cmp); //将起始点也当成一个平台
a[].h=H;
a[].x1=a[].x2=X;
dp[n][]=dp[n][]=;
dp[][]=dp[][]=inf;
//自底向上推
for(int i=n-;i>=;i--){
//往左走
for(int j=i+;j<=n;j++){
if(a[i].h-a[j].h<=MAX){
if(a[j].x1<=a[i].x1&&a[j].x2>=a[i].x1){
dp[i][]=min(dp[j][]+a[i].x1-a[j].x1,dp[j][]+a[j].x2-a[i].x1);
break;
}
}
}
//下面没平台且里地面高度不超过MAX
if(a[i].h<=MAX&&dp[i][]==inf)
dp[i][]=; //往右走
for(int j=i+;j<=n;j++) {
if(a[i].h-a[j].h<=MAX){
if(a[j].x2>=a[i].x2&&a[j].x1<=a[i].x2){
dp[i][]=min(dp[j][]+a[j].x2-a[i].x2,dp[j][]+a[i].x2-a[j].x1);
break;
}
}
}
if(a[i].h<=MAX&&dp[i][]==inf)
dp[i][]=;
}
printf("%d\n",min(dp[][],dp[][])+H);
}
return ;
}
POJ 1661 Help Jimmy(二维DP)的更多相关文章
- POJ 1661 Help Jimmy(递推DP)
思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...
- POJ 1661 Help Jimmy(C)动态规划
没刷过 POJ,这题是论坛有人问的,我才看看. 我发现 POJ 注册很奇怪,账号总是登不上去,弄的我还注册两个.Emmm 首次体验很差,还好我不在 POJ 刷题. 题目链接:POJ 1661 Help ...
- 洛谷p1732 活蹦乱跳的香穗子 二维DP
今天不BB了,直接帖原题吧 地址>>https://www.luogu.org/problem/show?pid=1732<< 题目描述 香穗子在田野上调蘑菇!她跳啊跳,发现 ...
- HDU - 2159 FATE(二维dp之01背包问题)
题目: 思路: 二维dp,完全背包,状态转移方程dp[i][z] = max(dp[i][z], dp[i-1][z-a[j]]+b[j]),dp[i][z]表示在杀i个怪,消耗z个容忍度的情况下 ...
- 传纸条 NOIP2008 洛谷1006 二维dp
二维dp 扯淡 一道比较基本的入门难度的二维dp,类似于那道方格取数,不过走过一次的点下次不能再走(看提交记录里面好像走过一次的加一次a[i][j]的也AC了,,),我记得当年那道方格取数死活听不懂, ...
- 洛谷P1048 采药 二维dp化一维
题目描述 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个 ...
- 关于二维DP————站上巨人的肩膀
意匠惨淡经营中ing, 语不惊人死不休........ 前几天学了DP,做了个简单的整理,记录了关于DP的一些概念之类的,今天记录一下刚学的一个类型 ----关于二维DP 那建立二维数组主要是干嘛用的 ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
随机推荐
- bzoj4584
escription 在首尔城中,汉江横贯东西.在汉江的北岸,从西向东星星点点地分布着个划艇学校,编号依次为到.每个学校都 拥有若干艘划艇.同一所学校的所有划艇颜色相同,不同的学校的划艇颜色互不相同. ...
- angular 有关侦测组件变化的 ChangeDetectorRef 对象
我们知道,如果我们绑定了组件数据到视图,例如使用 <p>{{content}}</p>,如果我们在组件中改变了content的值,那么视图也会更新为对应的值. angular ...
- libevent学习文档(二)eventbase相关接口和参数
Setting up a default event_base The event_base_new() function allocates and returns a new event base ...
- 在GitHub搭建个人博客 地址: https://douzujun.github.io/
搭建博客地址:https://douzujun.github.io/ 博客模板:https://github.com/douzujun/douzujun.github.io 显示效果:
- Python学习笔记(二十九)ThreadLocal
import threading #创建全局ThreadLocal对象: local_school = threading.local() def process_student(): #获取当前线程 ...
- 【BZOJ】2599: [IOI2011]Race 点分治
[题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...
- 导出数据excel表--身份证号后三位是0--〉还原
导出数据excel表的身份证号后三位是0,怎么办? 数据导出前,在身份证号前加任意符号即可 例如: 结果
- 漫谈JWT
一.JWT简介[对于了解JWT的童鞋,可以直接跳到最后] 咱们就不弄那些乱七八糟的概念,就简单点说一下JWT是什么.有什么和能干什么 1. JWT概念和作用 JWT全称为json web token, ...
- CodeForces - 1003D
Polycarp has nn coins, the value of the ii-th coin is aiai. It is guaranteed that all the values are ...
- NYOJ 117 求逆序数 (树状数组)
题目链接 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 现在,给你一个N个元素的序列,请你判断出 ...