POJ 1661 Help Jimmy(DP,注意边界)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 9399 | Accepted: 3025 |
Description

场景中包含多个长度和高度各不同样的平台。
地面是最低的平台,高度为零,长度无限。
Jimmy老鼠在时刻0从高于全部平台的某处開始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑。它跑动的速度也是1米/秒。当Jimmy跑到平台的边缘时。開始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。
设计一个程序。计算Jimmy究竟地面时可能的最早时间。
Input
1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i
= 1..N)。全部坐标的单位都是米。
Jimmy的大小和平台的厚度均忽略不计。假设Jimmy恰好落在某个平台的边缘,被视为落在平台上。
全部的平台均不重叠或相连。測试数据保证问题一定有解。
Output
Sample Input
1
3 8 17 20
0 10 8
0 10 13
4 14 3
Sample Output
23
Source
POJ Monthly--2004.05.15 CEOI 2000
注意 [-10,10],[10,20],这两个平台在高度同意的情况下是能够跳的。
。
。
。被坑了好久
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <vector>
#include <map>
#include <queue>
#include <algorithm>
#include <stack>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
using namespace std;
#define INF 0x7fffffff
int n,x,y,maxn;
int dp[1111][2];//dp[i][0]表示到达i平台左端点最小值,dp[i][1]表示右端点最小值
bool vist[1111][2];
struct node{
int l;
int r;
int h;
}dian[1111]; int cmp(const node &a,const node &b){
return a.h>b.h;
}
int main() {
// freopen("G://test.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&x,&y,&maxn);
memset(vist,false,sizeof(vist));
dian[0].l=x;
dian[0].r=x;
dian[0].h=y;
dp[0][0]=0;
dp[0][1]=0;
for(int i=1;i<=n;++i){
scanf("%d%d%d",&dian[i].l,&dian[i].r,&dian[i].h);
dp[i][0]=dp[i][1]=INF;
}
sort(dian+1,dian+n+1,cmp);
for(int i=1;i<=n;++i){
for(int j=0;j<i;++j){//枚举比i高的或者相等的(相等的以下if给T掉了)
if(vist[j][0]==false){
if(dian[j].h>dian[i].h&&dian[j].h-dian[i].h<=maxn&&dian[j].l>=dian[i].l&&dian[j].l<=dian[i].r){
vist[j][0]=true;
if(dp[j][0]==INF)
continue;
dp[i][0]=min(dp[i][0],dp[j][0]+dian[j].l-dian[i].l);
dp[i][1]=min(dp[i][1],dp[j][0]+dian[i].r-dian[j].l);
}
}//左边 if(vist[j][1]==false){
if(dian[j].h>dian[i].h&&dian[j].h-dian[i].h<=maxn&&dian[j].r>=dian[i].l&&dian[j].r<=dian[i].r){
vist[j][1]=true;
if(dp[j][1]==INF)
continue;
dp[i][0]=min(dp[i][0],dp[j][1]+dian[j].r-dian[i].l);
dp[i][1]=min(dp[i][1],dp[j][1]+dian[i].r-dian[j].r);
}
}//右边
}//for
}//for int ans=INF;
for(int i=0;i<=n;++i){
if(vist[i][0]==false&&dian[i].h<=maxn)
ans=min(ans,dp[i][0]);
if(vist[i][1]==false&&dian[i].h<=maxn)
ans=min(ans,dp[i][1]);
}
if(ans==INF){
printf("大兄弟。 。。大于等于这个边界我也是跪了\n"); }
else
printf("%d\n",ans+y); }
return 0;
}
POJ 1661 Help Jimmy(DP,注意边界)的更多相关文章
- POJ 1661 Help Jimmy DP
思路:Jimmy 跳到一块板上后,可以有两种选择,向左走或向右走.走到左端和走到右端所需的时间,容易算出. n如果我们能知道,以左端为起点到达地面的最短时间,和以右端为起点到达地面的最短时间,那么向左 ...
- POJ 1661 Help Jimmy(C)动态规划
没刷过 POJ,这题是论坛有人问的,我才看看. 我发现 POJ 注册很奇怪,账号总是登不上去,弄的我还注册两个.Emmm 首次体验很差,还好我不在 POJ 刷题. 题目链接:POJ 1661 Help ...
- POJ 1661 Help Jimmy(递推DP)
思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...
- POJ 1661 Help Jimmy(二维DP)
题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...
- POJ - 1661 - Help Jimmy - 简单dp
http://poj.org/problem?id=1661 一般化处理,把一开始的落地和大地都视作平台,设计平台类的属性.dp的时候显然是从上往下dp的,而且要小心Jimmy不能够穿过平台,也就是从 ...
- POJ 1661 Help Jimmy【DP】
基础DP,过程想明白了其实也不复杂,从上面的推下面的比倒着推要简单很多.调试了半个多小时..简单dp依然不能快速AC..SAD.. 题目链接: http://poj.org/problem?id=16 ...
- POJ 1661 Help Jimmy LIS DP
http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...
- POJ 1661 Help Jimmy(DP/最短路)
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14980 Accepted: 4993 Descripti ...
- Help Jimmy POJ - 1661 数字三角DP
题意:中文 https://vjudge.net/problem/POJ-1661 题解:设两个dp数组,dpl[i]存 从第i块板左边到地上所花的最短时间,dpr[i]存右边的. 将所有板按高度排序 ...
随机推荐
- ruby 安装 mysql2 命令
sudo apt-get install libmysql-ruby libmyclient-dev
- ios video标签部分mp4文件无法播放的问题
问题描述: 部分MP4文件在ios的微信浏览器中无法播放,点击播放后缓冲一下之后显示叉,而另外一些mp4文件正常,同时在安卓全部下正常. 分析: h264编码的压缩级别问题导致. 苹果官方文档中对 i ...
- Mybatis主配置文件常见使用讲解
在开发中我们通常将Mybatis中配置文件分两种,主配置文件与和dao对应的映射文件. 其实最后mybatis解析的还是一个主配置文件. 而映射文件会通过我们配置<mappers>属性,或 ...
- vimgdb安装以及使用
vimgdb安装 vim-7.3.tar.bz2http://www.vim.org/sources.phpvimgdb-for-vim7.3 (this patch) https://github. ...
- 72、django之简单验证码实现与form表单钩子函数补充
本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...
- ssh密钥登录
一.生成密钥对(两种方式)并配置 方式1:使用ssh-keygen(1)生成并配置 (1)生成密钥对 [root@iZwz9catu2mrq92b07d1d0Z ~]# ssh-keygen -t r ...
- Bitmap.Config 说明 ALPHA_8 ARGB_4444 ARGB_8888 RGB_565
这篇文章的目的是了解Bitmap.Config 你可以在使用这个方法的时候会遇到 Bitmap android.graphics.Bitmap.createBitmap(int width, int ...
- laravel 嵌套的渴求式加载
今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...
- A workaround to change shared memory size for Docker containers in AWS ECS
Issue Because of not supporting to specify the following docker run parameter, containers in ECS can ...
- Codeforces543BDestory Roads心得
题目描述: In some country there are exactly n cities and m bidirectional roads connecting the cities. Ci ...