Help Jimmy
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 14214   Accepted: 4729

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

思路:本来以为是dp二维x, y, 但是不可能开那么大,状态也不好规划。无奈之下看了题解。

dp[i][0]表示从左边到达i的最小花费
dp[i][1]表示从右边到达i的最小花费

然后考虑怎么转移。

例:

-----------------------------------

----------------                  --------------------

到达最上面的木板可以从左边或右边,下面的一直递推。

状态转移方程:

dp[i][0] = h[i] - h[j] +  min( dp[j][0] + l[i] - l[j], dp[j][1] + r[j] - l[i] )

dp[i][1] = h[i] - h[j] + min( dp[j][0] + r[i] - l[j], dp[j][1] + r[j] - r[i] )

也就是线段左端 + 交叉的距离 或 线段右端 + 交叉的距离

其中还有最大高度的细节处理,分为两类,①找不到并且距离之外,②找不到但距离之内

 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
using namespace std;
#define mem(a,b) memset((a),(b),sizeof(a))
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define sz(x) (int)x.size()
#define all(x) x.begin(),x.end()
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll INF =0x3f3f3f3f3f3f3f3f;
const double pi = acos(-1.0);
const double eps = 1e-;
const ll mod = 1e9+;
//head int dp[][];//dp[i][0]表示从左边到达i的最小花费
//dp[i][1]表示从右边到达i的最小花费
struct node{
int r, l, h;
}stu[]; bool cmp(node a, node b) {//按高度排序
if(a.h != b.h)
return a.h < b.h;
return a.l < b.l;
} bool flag;
int main(int argc, char const *argv[])
{
int _, n, x, y, m;
for(scanf("%d", &_);_;_--) {
memset(dp, , sizeof(dp));
scanf("%d%d%d%d", &n, &x, &y, &m);
for(int i = ; i < n; i++) {
scanf("%d%d%d", &stu[i].l, &stu[i].r, &stu[i].h);
}
sort(stu, stu + n, cmp);
stu[n].l = stu[n].r = x;
stu[n].h = y;
for(int i = ; i < n + ; i++) {
flag = false;//标记
for(int j = i - ; j >= ; j--) {//左
if(stu[i].h - stu[j].h <= m && stu[i].h > stu[j].h)//保证不摔的前提
if(stu[j].l <= stu[i].l && stu[j].r >= stu[i].l) {//可以从左边到达的条件
dp[i][] = stu[i].h - stu[j].h + min(dp[j][] + stu[i].l - stu[j].l, dp[j][] + stu[j].r - stu[i].l);
flag = true;//标记找到
break;//递推,找到一个就break
}
}
if(stu[i].h > m && flag == false) {//如果找不到,并且木板i到达地面高度大于m -----无穷大
dp[i][] = inf;
} else if(flag == false){//找不到,但是到达地面高度 <= m
dp[i][] = stu[i].h;
}
flag = false;//同理求出右边的最小花费
for(int j = i - ; j >= ; j--) {//右
if(stu[i].h - stu[j].h <= m && stu[i].h > stu[j].h)
if(stu[j].l <= stu[i].r && stu[j].r >= stu[i].r) {
dp[i][] = stu[i].h - stu[j].h + min(dp[j][] + stu[i].r - stu[j].l, dp[j][] + stu[j].r - stu[i].r);
flag = true;
break;
}
}
if(stu[i].h > m && flag == false) {
dp[i][] = inf;
} else if(flag == false) {
dp[i][] = stu[i].h;
}
}
printf("%d\n", min(dp[n][], dp[n][]));//到达木板n的最小花费
}
return ;
}

kuangbin专题十二 POJ1661 Help Jimmy (dp)的更多相关文章

  1. kuangbin专题十二 HDU1260 Tickets (dp)

    Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  2. kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)

    Treats for the Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7949   Accepted: 42 ...

  3. kuangbin专题十二 HDU1176 免费馅饼 (dp)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. kuangbin专题十二 HDU1078 FatMouse and Cheese )(dp + dfs 记忆化搜索)

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. kuangbin专题十二 HDU1074 Doing Homework (状压dp)

    Doing Homework Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. kuangbin专题十二 HDU1069 Monkey and Banana (dp)

    Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. kuangbin专题十二 HDU1029 Ignatius and the Princess IV (水题)

    Ignatius and the Princess IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32767 K ( ...

  8. kuangbin专题十二 HDU1114 Piggy-Bank (完全背包)

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  9. kuangbin专题十二 HDU1087 Super Jumping! Jumping! Jumping! (LIS)

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

随机推荐

  1. 利用DNS进行传输数据

    曾经有这样一道题目,困了我数个小时,最后我尝试利用此方法时我知道真相的时候,眼泪已掉下来. 遇到的是一个流量分析题,分析DNS数据,拿到flag 流量如图所示: 进入linux,提取: [root@s ...

  2. 2016.5.30让窗口处于最顶层的方法,比TopMost灵活

    最简单的方法Form. Activate() 稍复杂的方法用API,目前没有看出比第一种方法有什么好处(可操作其它窗口,这就是好处2016.7.31) [System.Runtime.InteropS ...

  3. 什么是SPU、SKU、SKC、ARPU

    首先,搞清楚商品与单品的区别.例如,iphone是一个单品,但是在淘宝上当很多商家同时出售这个产品的时候,iphone就是一个商品了. 商品:淘宝叫item,京东叫product,商品特指与商家有关的 ...

  4. Solaris10 如何设置空闲ssh连接超时断开

    在ssh的配置文件中有2个参数可以控制空闲连接超时断开.这2个参数是ClientAliveCountMax和ClientAliveInterval. Solaris10上设置空闲ssh连接超时断开的方 ...

  5. jxl.read.biff.BiffException: Unable to recognize OLE stream异常

    java代码读取excel文件时报: jxl.read.biff.BiffException: Unable to recognize OLE stream    at jxl.read.biff.C ...

  6. JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

    conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("trunca ...

  7. 【275】◀▶ Python 控制语句说明

    参考:Python循环语句 01   for 循环语句. 02   while 循环语句. 03   if...else 选择语句. 04   continue 执行循环语句中的下一条循环. 05   ...

  8. SQL查询语句 [1]

    一.使用字符串作为条件查询 在 Home/controller/UserController.class.php 下插入 <?php namespace Home\Controller; use ...

  9. ZROI2018普转提day7t1

    传送门 分析 一道有意思的小题... 我们发现如果$(1,1)$为白色,则将其变为白色需要偶数次操作,而如果为黑色则需要奇数次操作 我们知道要让A赢需要奇数次操作,所以我们只需要判断$(1,1)$的颜 ...

  10. Luogu 3168 [CQOI2015]任务查询系统

    区间修改单点查询,又观察到是一个k小,考虑主席树上做差分 一开始样例疯狂挂,后来发现主席树在一个历史版本上只能修改一次,所以要开2*n个根结点,记录一下每个时间对应的根结点编号 然后80分,考虑到当一 ...