POJ 1661
http://poj.org/problem?id=1661

这是一道DP的题目,求最优解
上面的这一个题是对于那个重左边开始上的函数的解释
题目要求的是从最高掉下来的小时间,那么我们就可以求从最低处上到最高处的最短时间,反过来
#include <stdio.h>
#include <stdlib.h> int dp[][],N,max1; struct In{
int h;
int lx;
int rx;
}s[]; int cmp(const void *a,const void *b)
{
return (*(In *)a).h-(*(In *)b).h;
}
int Min1(int x,int y)
{
return (x<y)?x:y;
} void turnleftmintime(int i)
{
int k=i-;
while(k>&&s[i].h-s[k].h<=max1) //由于是从下面往上面走,所以呢,第一层肯定不在地上,因为在地上不需要移动距离,只需要跳上去的时间便可,且上一层一下一层的距离肯定要小于最大距离
{
if(s[i].lx>=s[k].lx&&s[i].lx<=s[k].rx) //这个就是那个图示的意思了,s[i].lx>=s[k].lx代表着下一层的左边肯定要在上一层左边的左边,意思就是上一层的左边肯定要大于下一层的右边
//且上一层的左边肯定也要在下一层的右边的左边,不然没有交集跳不上,如果上一层不符合的话,那么从下下一层在试,因为上一层肯定是要用到的,
{
dp[i][] = s[i].h-s[k].h+Min1(s[i].lx-s[k].lx+dp[k][],s[k].rx-s[i].lx+dp[k][]); //dp[i][0]是用来存从左边开始往上跳到第i层的最短时间,而其它的时间就是等于距离差加上,从左边上和从右边上的时间,选择时间短的。 return;
}
else k--;
}
if(s[i].h-s[k].h>max1) //这个就是考虑前几层都不符合条件的情况下还有跳第一层时的情况
dp[i][]=;
else dp[i][]=s[i].h;
} void turnrightmintime(int i)
{
int k=i-;
while(k>&&s[i].h-s[k].h<=max1)
{
if(s[i].rx<=s[k].rx&&s[i].rx>=s[k].lx)
{
dp[i][]=s[i].h-s[k].h+Min1(s[i].rx-s[k].lx+dp[k][],s[k].rx-s[i].rx+dp[k][]);
return;
}
else k--;
}
if(s[i].h-s[k].h>max1)
dp[i][]=;
else dp[i][]=s[i].h;
} int shorttime()
{
int i;
for(i=;i<=N+;i++)
{
turnleftmintime(i);
turnrightmintime(i);
}
return Min1(dp[N+][],dp[N+][]);
} int main()
{
int n,x,y;
scanf("%d",&n);
while(n)
{
n--;
scanf("%d%d%d%d",&N,&x,&y,&max1);
for(int i=;i<=N;i++)
scanf("%d%d%d",&s[i].lx,&s[i].rx,&s[i].h);
s[].h=; //这个的目的就是用于跳第一层,除了h有用,其他两个值都没用的
s[].lx=-;
s[].rx=;
s[N+].h=y;
s[N+].lx=x; //这个就是目标地点
s[N+].rx=x;
qsort(s,N+,sizeof(s[]),cmp);
printf("%d\n",shorttime());
}
return ;
}
POJ 1661的更多相关文章
- 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 ...
- E - Help Jimmy POJ - 1661 dp
E - Help Jimmy POJ - 1661 这个题目本身不是很难,但是可以更加优化这个写法. 开始是n*n #include <cstdio> #include <cstri ...
- POJ 1661 Help Jimmy LIS DP
http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...
- POJ 1661 Help Jimmy -- 动态规划
题目地址:http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度 ...
- OpenJudge/Poj 1661 帮助 Jimmy
1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...
- (动规 或 最短路)Help Jimmy(poj 1661)
http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的 ...
- 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不能够穿过平台,也就是从 ...
随机推荐
- C++中const 的各种用法
C++中const 关键字的用法 const修饰变量 const 主要用于把一个对象转换成一个常量,例如: ; size = ; // error: assignment of read-only v ...
- linux标准输入输出及错误输出
Linux Shell 环境中支持输入输出重定向,用符号"<"和">"来表示. 0.1和2分别表示标准输入.标准输出和标准错误信息输出,可以用来指定 ...
- CF464A (模拟)
http://codeforces.com/contest/465/problem/C Codeforces Round #265 (Div. 2) C Codeforces Round #265 ( ...
- 2015年12月01日 GitHub入门学习(二)手把手教你Git安装
序:Mac与Linux中,Mac都预装了Git,各版本的Linux也都提供了Git的软件包.下面手把手教你Windows下的安装. 一.Git Windows GUI 下载地址 msysgit htt ...
- 字符编码详解及由来(UNICODE,UTF-8,GBK)
一直对字符的各种编码方式懵懵懂懂,什么ANSI.UNICODE.UTF-8.GB2312.GBK.DBCS.UCS--是不是看的很晕,假如您细细的阅读本文你一定可以清晰的理解他们.Let's ...
- ThinkPHP魔术方法
我们在使用thinkphp开发系统的时候,有时候会用到getById('1')这个方法快速的获取一条信息的内容,比用where(" id =1 ")->find();好用多了 ...
- IOS学习目录
一.UI 1.基础控件 2.高级控件 二.多线程网络 1.网络请求.网络安全 2.
- H5图像遮罩-遁地龙卷风
(-1)写在前面 这个idea不是我的,向这位前辈致敬.我用的是chrome49.用到的图片资源在我的百度云盘里http://yun.baidu.com/share/link?shareid=1970 ...
- BZOJ3196——二逼平衡树
1.题目大意:给你一个序列,有5种操作,都有什么呢... 1> 区间第k小 这个直接用二分+树套树做 2> 区间小于k的有多少 这个直接用树套树做 3> 单点修改 这个直接用树套树做 ...
- BZOJ3223——Tyvj 1729 文艺平衡树
1.题目大意:维护序列,只有区间翻转这个操作 2.分析:splay的经典操作就是实现区间翻转,就是在splay中有一个标记,表示这个区间被翻转了 然后就是记得各种的操作访问某个点时,记得下传,顺便交换 ...