1.链接地址:

bailian.openjudge.cn/practice/1661

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

2.题目:

总Time Limit:
1000ms
Memory Limit:
65536kB
Description
"Help Jimmy" 是在下图所示的场景上完成的游戏。

场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。

Jimmy
老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时,游戏者选择让它向左还是向右跑,它跑动的速度也
是1米/秒。当Jimmy跑到平台的边缘时,开始继续下落。Jimmy每次下落的高度不能超过MAX米,不然就会摔死,游戏也会结束。

设计一个程序,计算Jimmy到底地面时可能的最早时间。

Input
第一行是测试数据的组数t(0 <= t <=
20)。每组测试数据的第一行是四个整数N,X,Y,MAX,用空格分隔。N是平台的数目(不包括地面),X和Y是Jimmy开始下落的位置的横竖坐
标,MAX是一次下落的最大高度。接下来的N行每行描述一个平台,包括三个整数,X1[i],X2[i]和H[i]。H[i]表示平台的高度,X1[i]
和X2[i]表示平台左右端点的横坐标。1 <= N <= 1000,-20000 <= X, X1[i], X2[i]
<= 20000,0 < H[i] < Y <= 20000(i = 1..N)。所有坐标的单位都是米。

Jimmy的大小和平台的厚度均忽略不计。如果Jimmy恰好落在某个平台的边缘,被视为落在平台上。所有的平台均不重叠或相连。测试数据保证问题一定有解。

Output
对输入的每组测试数据,输出一个整数,Jimmy到底地面时可能的最早时间。
Sample Input
1
3 8 17 20
0 10 8
0 10 13
4 14 3
Sample Output
23
Source
POJ Monthly--2004.05.15 CEOI 2000

3.思路:

动态规划题目

注意Jimmy老鼠直接落到0高度的情况

4.代码:

 #include <iostream>
#include <cstdio>
#include <cstdlib> using namespace std; struct FLAT
{
int x[];
int h;
}; int cmp(const void* a,const void* b)
{
FLAT flat1 = *((FLAT *)a);
FLAT flat2 = *((FLAT *)b); return flat1.h - flat2.h;
} int main()
{
//freopen("C://input.txt","r",stdin); int t;
cin >> t; // 0 <= t <= 20 int i,j,k; int n,x,y,max;
while(t--)
{
//1 <= N <= 1000,-20000 <= X, X1[i], X2[i] <= 20000,0 < H[i] < Y <= 20000(i = 1..N)
cin >> n >> x >> y >> max; FLAT *arr_flat = new FLAT[n]; for(i = ; i < n; ++i) cin >> arr_flat[i].x[] >> arr_flat[i].x[] >> arr_flat[i].h;
qsort(arr_flat,n,sizeof(FLAT),cmp); //for(i = 0; i < n; ++i) cout << arr_flat[i].x[0] << " " << arr_flat[i].x[1] << " " << arr_flat[i].h << endl; int m;
for(m = n - ; m >= ; --m)
{
if(y - arr_flat[m].h <= max && x >= arr_flat[m].x[] && arr_flat[m].x[] >= x) break;
}
if(m < )
{
cout << y << endl;
continue;
} //dp
int **dp = new int*[m + ];
for(i = ; i <= m; ++i) dp[i] = new int[]; dp[][] = arr_flat[].h;
dp[][] = arr_flat[].h; for(i = ; i <= m; ++i)
{
for(j = ; j < ; ++j)
{
int flag = ;
for(k = i - ; k >= ; --k)
{
if(arr_flat[i].h - arr_flat[k].h > max) break;
else
{
if(arr_flat[k].x[] <= arr_flat[i].x[j] && arr_flat[k].x[] >= arr_flat[i].x[j])
{
flag = ;
break;
}
}
}
if(flag == )
{
if(arr_flat[i].h < max) dp[i][j] = arr_flat[i].h;
else dp[i][j] = -;
}
else
{
if(dp[k][] == - && dp[k][] == -) dp[i][j] = -;
else if(dp[k][] == -) dp[i][j] = dp[k][] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[k].x[] - arr_flat[i].x[j]);
else if(dp[k][] == -) dp[i][j] = dp[k][] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[i].x[j] - arr_flat[k].x[]);
else
{
int temp1 = dp[k][] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[i].x[j] - arr_flat[k].x[]);
int temp2 = dp[k][] + (arr_flat[i].h - arr_flat[k].h) + (arr_flat[k].x[] - arr_flat[i].x[j]);
dp[i][j] = temp1 < temp2 ? temp1 : temp2;
}
}
}
} if(dp[m][] == -) cout << dp[m][] + (arr_flat[m].x[] - x) + (y - arr_flat[m].h) << endl;
else if(dp[m][] == -) cout << dp[m][] + (x - arr_flat[m].x[]) + (y - arr_flat[m].h) << endl;
else
{
int temp1 = dp[m][] + (arr_flat[m].x[] - x) + (y - arr_flat[m].h);
int temp2 = dp[m][] + (x - arr_flat[m].x[]) + (y - arr_flat[m].h);
cout << (temp1 < temp2 ? temp1 : temp2) << endl;
} for(i = ; i <= m; ++i) delete [] dp[i];
delete [] dp; delete [] arr_flat;
} return ;
}

OpenJudge/Poj 1661 帮助 Jimmy的更多相关文章

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

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

  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 Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度 ...

  4. POJ 1661 Help Jimmy(二维DP)

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

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

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

  6. POJ 1661 Help Jimmy【DP】

    基础DP,过程想明白了其实也不复杂,从上面的推下面的比倒着推要简单很多.调试了半个多小时..简单dp依然不能快速AC..SAD.. 题目链接: http://poj.org/problem?id=16 ...

  7. POJ 1661 Help Jimmy LIS DP

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

  8. POJ 1661 Help Jimmy(DP,注意边界)

    Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9399   Accepted: 3025 Descri ...

  9. POJ 1661 Help Jimmy(DP/最短路)

    Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14980 Accepted: 4993 Descripti ...

随机推荐

  1. mysql之数据库备份与恢复

    备份与恢复 系统运行中,增量备份与整体备份. 例如:每周日整体备份一次,周一到周六只备份当天. 如果周五的数据出了问题,可以用周日的整体+周一.周二.周三.周四来恢复. 备份的工具: 有第三方的收费备 ...

  2. js获取上传文件内容(未完待续)

    js 获取上传文件的字节数及内容 <div> 上传文件 : <input type="file" name = "file" id = &qu ...

  3. mybatis 打印sql log配置

    mybatis 打印sql log, 方便调试.如何配置呢? log4j.xml : <!-- 打印sql start --> <appender name="IBatis ...

  4. iOS开发-分页栏和选取器的使用

    一.分页栏 创建一个新的项目,Subclass of的值选中UIViewController,然后在storyboard中删除根视图,在右下方拖出一个Tab Bar Controller 新增分页,只 ...

  5. android学习日记23--Android XML解析

    一.简述 XML语言是跨平台,JAVA对XML语言支持得比较好,android系统的应用层平台是JAVA做的,所以用XML.XML解析比较简单.XML解析就是将获取到的数据分离出来,基本的网络数据传输 ...

  6. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  7. careercup-C和C++ 13.8

    13.8 编写一个智能指针类.智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制.它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的 ...

  8. C#_MVC_ajax for form

    在上一篇介绍MVC中的Ajax实现方法的时候,曾经提到了除了使用Ajax HTML Helper方式来实现之外,Jquery也是实现Ajax的另外一种方案. 通过get方法实现AJax请求 View ...

  9. php面试常用算法

    这些都是真实的IT公司招聘PHP程序员的面试题,这些都是简单的基本算法.包括:冒泡算法.快速排序算法.二分查找算法.顺序算法. 冒泡排序,对象可以是一个数组 01 function bubble_so ...

  10. iOS 开发中你是否遇到这些经验问题(一)

    前言 小伙伴们在开发中难免会遇到问题, 你是如何解决问题的?不妨也分享给大家!如果此文章其中的任何一条问题对大家有帮助,那么它的存在是有意义的! 反正不管怎样遇到问题就要去解决问题, 在解决问题的同时 ...