【动态规划】POJ1661 Help Jimmy
Help Jimmy
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 11621 | Accepted: 3827 |
Description

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序,计算Jimmy到底地面时可能的最早时间。
Input
Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。
Output
Sample Input
1
3 8 17 20
0 10 8
0 10 13
4 14 3
Sample Output
23
Source
dp[i][0]=min(dp[i][0],dp[j][0]+abs(a[j].X1-a[i].X1)+a[i].H-a[j].H);
dp[i][0]=min(dp[i][0],dp[j][1]+abs(a[j].X2-a[i].X1)+a[i].H-a[j].H);
dp[i][1]=min(dp[i][1],dp[j][0]+abs(a[j].X1-a[i].X2)+a[i].H-a[j].H);
dp[i][1]=min(dp[i][1],dp[j][1]+abs(a[j].X2-a[i].X2)+a[i].H-a[j].H);
当然,前提是j块木板的高度差不能超过MAX且第i块木板落下到第j块木板(这个可以预处理)
这个题要倒着做!倒着做!
开始正着做了一遍,把discuss中的数据测光了也是对的,莫名其妙WA了一小时 TAT
后来花了10分钟重写了一个正着做的就一遍AC了……
此题需要注意的细节:
①MEMSET inf
②落到板子的边缘也算落在板子上
③在高度允许情况下可以直接落到地上
④abs
是否感觉有些反人类思维呢?听说最短路可以过TAT
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
//#include<cmath> using namespace std;
const int INF = 9999999;
#define LL long long inline int read(){
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int N,X,Y,MAX;
int T;
struct data{
int X1,X2,H;
}a[1001];
int dp[1001][2];
int down[1001][2];
int fir;
bool flag=false; bool cmp(data a,data b){
return a.H>b.H;
} void pre(){//预处理
sort(a+1,a+N+1,cmp);//sort一定要加
bool flag1=false,flag2=false;
for(int i=1;i<=N;i++){//记录第i块板子左/右落下会落到哪里
flag1=false,flag2=false;
for(int j=i+1;j<=N;j++){
if(flag1&&flag2) break;
if(a[i].H>a[j].H){
if(a[j].X1<=a[i].X1&&a[j].X2>=a[i].X1&&!flag1) down[i][0]=j,flag1=true;
if(a[j].X2>=a[i].X2&&a[j].X1<=a[i].X2&&!flag2) down[i][1]=j,flag2=true;
}
}
if(!flag1) down[i][0]=N+1;//N+1板子为地面
if(!flag2) down[i][1]=N+1;
}
a[N+1].H=0;a[N+1].X1=-INF,a[N+1].X2=INF;
for(int i=1;i<=N+1;i++){//预处理从初始点落下会落到哪里
if(Y-a[i].H<=MAX)
if(a[i].X1<=X&&a[i].X2>=X){
fir=i;
break;
}
}
if(fir==N+1){
printf("%d\n",Y);//可以直接落到地面上,直接输出
flag=true;
}
return ;
} int main(){
T=read();
while(T--){
flag=false;
N=read(),X=read(),Y=read(),MAX=read();
for(int i=1;i<=N;i++){
a[i].X1=read();
a[i].X2=read();
a[i].H=read();
}
memset(dp,INF,sizeof(dp));//memset
pre();
if(flag) continue;
dp[N+1][0]=0;
dp[N+1][1]=0;
dp[N][1]=dp[N][0]=a[N].H;
for(int i=N-1;i>=fir;i--){
for(int j=i+1;j<=N+1;j++){
if(abs(a[i].H-a[j].H)>MAX) break;//如果高度差已经大于MAX直接退出
if(down[i][0]==j){//dp
if(j!=N+1){
dp[i][0]=min(dp[i][0],dp[j][0]+abs(a[j].X1-a[i].X1)+a[i].H-a[j].H);
dp[i][0]=min(dp[i][0],dp[j][1]+abs(a[j].X2-a[i].X1)+a[i].H-a[j].H);
}
else dp[i][0]=min(dp[i][0],a[i].H);
}
if(down[i][1]==j){
if(j!=N+1){
dp[i][1]=min(dp[i][1],dp[j][0]+abs(a[j].X1-a[i].X2)+a[i].H-a[j].H);
dp[i][1]=min(dp[i][1],dp[j][1]+abs(a[j].X2-a[i].X2)+a[i].H-a[j].H);
}
else dp[i][1]=min(dp[i][1],a[i].H);
}
}
}
printf("%d\n",min(dp[fir][0]+abs(a[fir].X1-X)+abs(Y-a[fir].H),dp[fir][1]+abs(a[fir].X2-X)+abs(Y-a[fir].H)));
}
return 0;
}
【动态规划】POJ1661 Help Jimmy的更多相关文章
- POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9863 Accepted: 3201 Descriptio ...
- kuangbin专题十二 POJ1661 Help Jimmy (dp)
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14214 Accepted: 4729 Descr ...
- POJ1661 Help Jimmy —— DP
题目链接:http://poj.org/problem?id=1661 Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- OpenJudge/Poj 1661 帮助 Jimmy
1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...
- [kuangbin带你飞]专题十二 基础DP1
ID Origin Title 167 / 465 Problem A HDU 1024 Max Sum Plus Plus 234 / 372 Problem B HDU 1 ...
- 「kuangbin带你飞」专题十二 基础DP
layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...
- 动态规划3--Help Jimmy
动态规划3--Help Jimmy 一.心得 二.题目 三.分析 Jimmy跳到一块板上后,可以有两种选择,向左走,或向右走.走到左端和走到右端所需的时间,是很容易算的.如果我们能知道,以左端为起点到 ...
- 【POJ - 1661】Help Jimmy (动态规划)
Help Jimmy Descriptions: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长 ...
- POJ 1661 Help Jimmy(C)动态规划
没刷过 POJ,这题是论坛有人问的,我才看看. 我发现 POJ 注册很奇怪,账号总是登不上去,弄的我还注册两个.Emmm 首次体验很差,还好我不在 POJ 刷题. 题目链接:POJ 1661 Help ...
随机推荐
- 设计模式之Factory
设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Factory Pattern有3种当然是全部是creational pattern. 1.S ...
- linux 服务简介
Linux服务(Linux services)对于每个应用Linux的用户来说都很重要.关闭不需要的服务,可以让Linux运行的更高效,但并不是所有的Linux服务都可以关闭.今天安装了一次CentO ...
- AlertDialog.Builder 显示为白色 蓝色字
AlertDialog.Builder dialog = new AlertDialog.Builder( getActivity(),AlertDialog.THEME_HOLO_LIGHT);
- Python模块学习 - IPy
简介 在IP地址规划中,涉及到计算大量的IP地址,包括网段.网络掩码.广播地址.子网数.IP类型等,即便是专业的网络人员也要进行繁琐的计算,而IPy模块提供了专门针对IPV4地址与IPV6地址的类与工 ...
- PHP路由代码
<?php /** * 路由 * @author 角度 QQ:1286522207 * */ class Dispatcher extends Action { private ...
- 深入分析_linux_spinlock_实现机制【转】
转自:http://blog.csdn.net/electrombile/article/details/51289813 在 x86 平台上,spinlock 主要通过处理器的 lock 指令前缀实 ...
- python基础===Python 迭代器模块 itertools 简介
本文转自:http://python.jobbole.com/85321/ Python提供了一个非常棒的模块用于创建自定义的迭代器,这个模块就是 itertools.itertools 提供的工具相 ...
- 自动化测试===requests+unittest+postman的接口测试
postman是一个跨平台的接口测试工具,下载链接在这里:https://www.getpostman.com/ unittest是一个单元测试框架,python中安装:pip install uni ...
- golang相关问题
[转载][翻译]Go的50坑:新Golang开发者要注意的陷阱.技巧和常见错误[1] Golang作为一个略古怪而新的语言,有自己一套特色和哲学.从其他语言转来的开发者在刚接触到的时候往往 ...
- 【python】日志系统
来源: http://blog.csdn.net/wykgf/article/details/11576721 http://www.jb51.net/article/42626.htm http:/ ...