POJ 1661 Help Jimmy DP
题目思路:状态转移方程很好推出,值得注意的是要分别判断是否能从一个平台的某侧移动到另一平台,也就是说要判断过一个平台的左端点或右端点做垂线,看这条垂线是否经过其他平台。
#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相关推荐
- POJ - 1661 Help Jimmy DP
题目链接 题意:题意很明了,就是求从最高点最短多长时间到达地面,从板上的移动与空中下落的速度都是1: 做法:我们首先将所有的板子与起点按照,左.右端点,高度存起来,按照高度升序. 然后dp,设dp[i ...
- POJ 1661 Help Jimmy(递推DP)
思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...
- POJ 1661 Help Jimmy
传送门:http://poj.org/problem?id=1661 解题思路:其实吧,不难就是细节有点麻烦. 实现代码: #include <iostream> #include < ...
- Help Jimmy POJ - 1661
Help Jimmy POJ - 1661 题意: 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终 ...
- 动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]
Help Jimmy POJ - 1661 题意:大致是一个人从某个点开始下落,下落的速度是1m/s,然后在平台上的时候可以左右移动,移动的速度也是1m/s,但是这里有一个限制,就是说每次下落的距离不 ...
- 【POJ - 1661】Help Jimmy(记忆化搜索,dp)
题干: Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开 ...
- POJ 1661 DP
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11071 Accepted: 3607 Descr ...
- poj 1185(状压dp)
题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...
- poj 2948 Martian Mining (dp)
http://poj.org/problem?id=2948 意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少.如图所示,最北边有 ...
最新文章
- Go - 反射中 函数 和 方法 的调用 - v.Call()
- 【成长之路】【python】python基础5-模块
- php consul 服务注册,CentOS 安装 Consul 服务注册和发现软件
- 提供写入的数据少于指定的数据_指定范围数据的汇总
- dedecms右侧悬浮_织梦dedecms网站上添加漂浮广告
- Android 系统性能优化(29)---给 App 提速:Android 性能优化总结
- python中的update是什么意思_python 字典中的Update()函数
- JavaScript-浅谈DOM事件流
- protobuf 编码实现解析(java)
- Hadoop的Writerable在Spark无法序列化的问题
- 简析边缘数据中心技术
- Python的字符串格式化 %r %s
- python3 与python2 异常处理的区别与联系
- 电子计算机 电子工程 职称,电子信息工程师职称评定
- 轨道客流预测TransCAD公交分配结果详解
- 30个编程领域的趣图
- 江西省吉安市谷歌高清卫星地图下载
- 网线的制作及交换机的基本配置
- easyexcel结合zip 导出压缩文件(包含多个excel)
- Ubuntu 之 Audacity踩坑之旅