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的更多相关文章

  1. POJ 1661 Help Jimmy(递推DP)

    思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...

  2. POJ 1661 Help Jimmy(C)动态规划

    没刷过 POJ,这题是论坛有人问的,我才看看. 我发现 POJ 注册很奇怪,账号总是登不上去,弄的我还注册两个.Emmm 首次体验很差,还好我不在 POJ 刷题. 题目链接:POJ 1661 Help ...

  3. E - Help Jimmy POJ - 1661 dp

    E - Help Jimmy POJ - 1661 这个题目本身不是很难,但是可以更加优化这个写法. 开始是n*n #include <cstdio> #include <cstri ...

  4. POJ 1661 Help Jimmy LIS DP

    http://poj.org/problem?id=1661 对板按高度排序后. dp[i][0]表示现在站在第i块板上,向左跑了,的状态,记录下时间和其他信息. O(n^2)LIS: 唯一的麻烦就是 ...

  5. POJ 1661 Help Jimmy -- 动态规划

    题目地址:http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度 ...

  6. OpenJudge/Poj 1661 帮助 Jimmy

    1.链接地址: bailian.openjudge.cn/practice/1661 http://poj.org/problem?id=1661 2.题目: 总Time Limit: 1000ms ...

  7. (动规 或 最短路)Help Jimmy(poj 1661)

    http://poj.org/problem?id=1661 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的 ...

  8. POJ 1661 Help Jimmy(二维DP)

    题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...

  9. POJ - 1661 - Help Jimmy - 简单dp

    http://poj.org/problem?id=1661 一般化处理,把一开始的落地和大地都视作平台,设计平台类的属性.dp的时候显然是从上往下dp的,而且要小心Jimmy不能够穿过平台,也就是从 ...

随机推荐

  1. sqlserver权限体系(下)

    简介 在上一篇文章中,我对主体的概念做了全面的阐述.本篇文章接着讲述主体所作用的安全对象以及所对应的权限. 理解安全对象(Securable) 安全对象,是SQL Server 数据库引擎授权系统控制 ...

  2. redis使用watch完成秒杀抢购功能(转)

    redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...

  3. Yii2 使用 Joins 查询

    Join() JOIN_TYPE = INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN 等等 语法 $query = new ...

  4. CentOs图形界面的开启与关闭

    1.1 shell中运行 init 3  进入文本模式,同时会关闭相关的服务(Xserver 肯定关闭) 1.2 Alt+Ctrl+F1~F6到字符界面,root登陆,ps aux|grep /usr ...

  5. javascript的对象 和 JSON 对象?

    关于js和JSON的 一篇 好文章: http://www.68idc.cn/help/makewebs/javascript/20150704416007.html 讲的很好 很易懂 在将javas ...

  6. php开发中怎么获取服务端MAC地址?

    MAC(Media Access Control或者Medium Access Control)地址,意译为媒体访问控制,或称为物理地址.硬件地址,用来定义网络设备的位置.在php中如何获取MAC(M ...

  7. Linux下查看文件内容的命令

    查看文件内容的命令: cat     由第一行开始显示内容,并将所有内容输出 tac     从最后一行倒序显示内容,并将所有内容输出 more    根据窗口大小,一页一页的现实文件内容 less ...

  8. AD域服务器|两台DC无法进行复制同步

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 说明:前段时间公司两台域控出现了一些问题导致数据无法相互进行同步,DC之间也无法进行共享访问,网络用户无法通过计算机名映射的共享访问 ...

  9. SQL Server 服务器器信息备份(一)--login新建脚本备份

    前言 若你的企业使用SQL Server数据库镜像为容灾技术. 那你一定做过在镜像切换之前要新建Login,而且若Login密码不同,要修改链接数据库的字符串,在切换完之后则仍需要给数据库重新赋予权限 ...

  10. js跳转页面

    <script type="text/javascript">  方法一: location.href = 'http://www.baidu.com'; 方法二: l ...