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. ubuntu系统无法访问无法磁盘最佳解决办法

    出现如下错误: Error mounting /dev/sda8 at /media/fzh/System: Command-line `mount -t "ntfs" -o &q ...

  2. data and dream

    1 用通俗的语言介绍下线性回归->逻辑回归->SVM之间的区别和联系. 2 聚类算法的应用场景,以及k-means中的k值怎么确定. def center(data): center = ...

  3. jdk的安装及配置

    前几天重新了下系统,所以JDK也要重新安装,顺带温故了安装及配置的过程,记录下来.(安装的版本是JDK1.7.0) 后面基本都是点下一步(i第一步选:开发工具),路径我改为E:/java/jdk 1. ...

  4. 使用DOS比较两个txt文件的差异

    将两个文件放入到同一个文件夹下 DOS下提供了FC命令 点击开始->运行->输入cmd,进入DOS下,进入指定目录,输入FC a.txt b.txt进行比较,下面会显示出之间的差异

  5. 点击每个li输出里面的内容(前端很常问的面试题之一)

    点击每个li输出里面的内容(前端很常问的面试题之一) 前端 面试 JavaScript <!DOCTYPE html> <html lang="en"> & ...

  6. PHP 使用命名空间(namespace),实现自动加载

    示例: #/DB/MySql.class.php也就是DB文件夹下有MySql.class.php文件 namespace DB; class MySql { public function __co ...

  7. activti表结构

    1.结构设计 1.1.    逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的 ...

  8. findByExample(Object exampleEntity)方法得到的List判断是否为空,不可用(lis != null)

    用findByExample(Object exampleEntity)方法可以应用在用户登录上面,获得有登陆名和密码的user对象进行查询. 返回两者都符合的对象列表,为空则登陆失败. 错误的方法: ...

  9. UI第二节——UIButton详解

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  10. Hadoop 面试题redis

    Hadoop 面试题之十 548.redis有什么特别之处,为什么用redis,用hbase 不行么? 答:redis 是基于内存的数据库,速度快 551.redis用什么版本? 3.0以上才支持集群 ...