题目思路:状态转移方程很好推出,值得注意的是要分别判断是否能从一个平台的某侧移动到另一平台,也就是说要判断过一个平台的左端点或右端点做垂线,看这条垂线是否经过其他平台。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#define INF 0x3FFFFFFF
#define MAXSIZE 1005using namespace std;struct node
{int x1,x2,h;
}a[MAXSIZE];struct node1
{int lt,rt;
}dp[MAXSIZE];int cmp(struct node A,struct node B)
{return A.h > B.h;
}int Check(int A,int B,int op) //OP=0 判断左侧是否联通,op=1判断右侧是否联通
{if(!op){for(int i=A+1;i<B;i++){if(a[A].x1>=a[i].x1 && a[A].x1<=a[i].x2)return 0;}if(a[A].x1>=a[B].x1 && a[A].x1<=a[B].x2)return 1;}else{for(int i=A+1;i<B;i++){if(a[A].x2>=a[i].x1 && a[A].x2<=a[i].x2)return 0;}if(a[A].x2>=a[B].x1 && a[A].x2<=a[B].x2)return 1;}
}int main()
{int maxn,T,n,X,Y;scanf("%d",&T);while(T--){scanf("%d%d%d%d",&n,&X,&Y,&maxn);for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].h);n++;a[n].x1=-20000;a[n].x2=20000;a[n].h=0;a[0].x1=X;a[0].x2=X;a[0].h=Y;sort(a,a+(n+1),cmp);dp[0].lt=dp[0].rt=0;for(int i=1;i<=n;i++)dp[i].lt=dp[i].rt=INF;for(int i=0;i<=n;i++){for(int j=0;j<i;j++){if(i==n && a[j].h-a[i].h<=maxn && a[j].h-a[i].h>0){if(a[j].x1>=a[i].x1 && a[j].x1<=a[i].x2 && Check(j,i,0)) //可从左点下落
                        {dp[i].lt=min(dp[i].lt,dp[j].lt+a[j].h-a[i].h);dp[i].rt=min(dp[i].rt,dp[j].lt+a[j].h-a[i].h);}if(a[j].x2>=a[i].x1 && a[j].x2<=a[i].x2 && Check(j,i,1)) //可以从右点下落
                        {dp[i].rt=min(dp[i].rt,dp[j].rt+a[j].h-a[i].h);dp[i].lt=min(dp[i].lt,dp[j].rt+a[j].h-a[i].h);}}else if(a[j].h-a[i].h<=maxn && a[j].h-a[i].h>0){if(a[j].x1>=a[i].x1 && a[j].x1<=a[i].x2 && Check(j,i,0)) //可从左点下落
                        {dp[i].lt=min(dp[i].lt,dp[j].lt+a[j].x1-a[i].x1+a[j].h-a[i].h);dp[i].rt=min(dp[i].rt,dp[j].lt+a[i].x2-a[j].x1+a[j].h-a[i].h);}if(a[j].x2>=a[i].x1 && a[j].x2<=a[i].x2 && Check(j,i,1)) //可以从右点下落
                        {dp[i].rt=min(dp[i].rt,dp[j].rt+a[i].x2-a[j].x2+a[j].h-a[i].h);dp[i].lt=min(dp[i].lt,dp[j].rt+a[j].x2-a[i].x1+a[j].h-a[i].h);}}}}int ans=min(dp[n].lt,dp[n].rt);printf("%d\n",ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/alan-W/p/6395262.html

POJ 1661 Help Jimmy DP相关推荐

  1. POJ - 1661 Help Jimmy DP

    题目链接 题意:题意很明了,就是求从最高点最短多长时间到达地面,从板上的移动与空中下落的速度都是1: 做法:我们首先将所有的板子与起点按照,左.右端点,高度存起来,按照高度升序. 然后dp,设dp[i ...

  2. POJ 1661 Help Jimmy(递推DP)

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

  3. POJ 1661 Help Jimmy

    传送门:http://poj.org/problem?id=1661 解题思路:其实吧,不难就是细节有点麻烦. 实现代码: #include <iostream> #include < ...

  4. Help Jimmy POJ - 1661

    Help Jimmy POJ - 1661 题意: 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终 ...

  5. 动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]

    Help Jimmy POJ - 1661 题意:大致是一个人从某个点开始下落,下落的速度是1m/s,然后在平台上的时候可以左右移动,移动的速度也是1m/s,但是这里有一个限制,就是说每次下落的距离不 ...

  6. 【POJ - 1661】Help Jimmy(记忆化搜索,dp)

    题干: Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开 ...

  7. POJ 1661 DP

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11071   Accepted: 3607 Descr ...

  8. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  9. poj 2948 Martian Mining (dp)

    http://poj.org/problem?id=2948 意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少.如图所示,最北边有 ...

最新文章

  1. Go - 反射中 函数 和 方法 的调用 - v.Call()
  2. 【成长之路】【python】python基础5-模块
  3. php consul 服务注册,CentOS 安装 Consul 服务注册和发现软件
  4. 提供写入的数据少于指定的数据_指定范围数据的汇总
  5. dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
  6. Android 系统性能优化(29)---给 App 提速:Android 性能优化总结
  7. python中的update是什么意思_python 字典中的Update()函数
  8. JavaScript-浅谈DOM事件流
  9. protobuf 编码实现解析(java)
  10. Hadoop的Writerable在Spark无法序列化的问题
  11. 简析边缘数据中心技术
  12. Python的字符串格式化 %r %s
  13. python3 与python2 异常处理的区别与联系
  14. 电子计算机 电子工程 职称,电子信息工程师职称评定
  15. 轨道客流预测TransCAD公交分配结果详解
  16. 30个编程领域的趣图
  17. 江西省吉安市谷歌高清卫星地图下载
  18. 网线的制作及交换机的基本配置
  19. easyexcel结合zip 导出压缩文件(包含多个excel)
  20. Ubuntu 之 Audacity踩坑之旅

热门文章

  1. Spring学习8-Spring事务管理(AOP/声明式式事务管理)
  2. docker目录挂载
  3. 计算机操作系统:存储器的管理
  4. 两个不同的文件相互引用全局变量
  5. Linux日志系统-02:logrotate简介
  6. Arduino常用函数总结
  7. Fatfs文件系所有函数总结
  8. 安装NFS服务,并挂载到开发板
  9. 常考数据结构与算法:异或操作
  10. 46. Ext中namespace的作用(转)