题目链接:http://poj.org/problem?id=1661

思路:

把初始位置看成左,右端点均为x0,即长度为0,高度为y0的一个平台,按照平台高度从低到高排序。用dp[i][0],dp[i][1]分别表示从第i个平台的左端,右端到地面的最短时间。tmp=get_next(i,0)表示第i个平台左端点下的平台的编号(若为-1表示下方已无平台),同理tmp=get_next(i,1)表示第i个平台右端点下的平台编号。因为求最小值,所以要将dp初始化为inf,因此状态转移方程如下(注意若下降高度大于Max,则不处理,即dp[i][j]等于inf):

if(tmp>=0){
                    if(a[i].h-a[tmp].h<=Max)
                        dp[i][j]=a[i].h-a[tmp].h+min(dp[tmp][0]+a[i].x[j]-a[tmp].x[0],dp[tmp][1]+a[tmp].x[1]-a[i].x[j]);
                }
                else{
                    if(a[i].h<=Max)
                        dp[i][j]=a[i].h;
                }
详见代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; struct node{
int x[],h;
}a[]; bool cmp(node xx,node yy){
return xx.h<yy.h;
} int T,n,x0,y0,Max;
int dp[][]; int get_next(int p,int k){
int q=p-;
for(;q>=;--q)
if(a[q].h<a[p].h&&a[p].x[k]>=a[q].x[]&&a[p].x[k]<=a[q].x[])
break;
return q;
} int main(){
scanf("%d",&T);
while(T--){
memset(dp,0x3f,sizeof(dp));
scanf("%d%d%d%d",&n,&x0,&y0,&Max);
a[n].x[]=a[n].x[]=x0,a[n].h=y0;
for(int i=;i<n;++i)
scanf("%d%d%d",&a[i].x[],&a[i].x[],&a[i].h);
sort(a,a+n,cmp);
int tmp;
for(int i=;i<=n;++i)
for(int j=;j<;++j){
tmp=get_next(i,j);
if(tmp>=){
if(a[i].h-a[tmp].h<=Max)
dp[i][j]=a[i].h-a[tmp].h+min(dp[tmp][]+a[i].x[j]-a[tmp].x[],dp[tmp][]+a[tmp].x[]-a[i].x[j]);
}
else{
if(a[i].h<=Max)
dp[i][j]=a[i].h;
}
}
printf("%d\n",dp[n][]);
}
return ;
}

poj1661 (DP)的更多相关文章

  1. Help Jimmy ~poj-1661 基础DP

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

  2. kuangbin专题十二 POJ1661 Help Jimmy (dp)

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

  3. poj1661【DP,左右两端dp】

    /* [过滤这一段~~~] 一开始想的[错误的,为自己的总结的写的,读者略过]: 每个状态的点肯定是高度,那么我DP每一层,这样的话就有一层循环,其实这无关复杂度,不会很多时间 错误的是想法是从最高层 ...

  4. POJ1661 Help Jimmy —— DP

    题目链接:http://poj.org/problem?id=1661 Help Jimmy Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  5. POJ1661(KB12-M DP)

    Help Jimmy Description "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无 ...

  6. Help Jimmy POJ - 1661 数字三角DP

    题意:中文 https://vjudge.net/problem/POJ-1661 题解:设两个dp数组,dpl[i]存 从第i块板左边到地上所花的最短时间,dpr[i]存右边的. 将所有板按高度排序 ...

  7. 「kuangbin带你飞」专题十二 基础DP

    layout: post title: 「kuangbin带你飞」专题十二 基础DP author: "luowentaoaa" catalog: true tags: mathj ...

  8. POJ-1661-Help Jimmy(DP, 递推)

    链接: https://vjudge.net/problem/POJ-1661 题意: "Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同 ...

  9. BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Statu ...

随机推荐

  1. bzoj1819 电子词典

    Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子 ...

  2. Oracle学习操作(5)触发器

    Oracle触发器 一.触发器简介 具备某些条件,由数据库自动执行的一些DML操作行为: 二.语句触发器 现在数据库创建t_book表:t_booktype表:t_book表的typeid存在外键参考 ...

  3. Floyd最短路径算法(来自微信公众号“算法爱好者”改编)

    暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表 ...

  4. nginx二进制编译-启动脚本编写

    首先先把这个文件上传到root目录下,并解压 #tar zxf nginx-1.11.2.tar.gz 写脚本 # vi nginx-running.sh 内容如下 #!/bin/bash #chkc ...

  5. java设计模式—工厂模式

    一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...

  6. Android RIL Architecture

    Android RIL Architecture   by Gomathi Sankar   Introduction   The Article explains about the buildin ...

  7. delphi WebBrowser的使用方法详解(三)

    WebBrowser 操作记要 WebBrowser1.GoHome;  //到浏览器默认主页 WebBrowser1.Refresh;  //刷新 WebBrowser1.GoBack;  //后退 ...

  8. Spark SQL Hive Support Demo

    前提: 1.spark1.0的包编译时指定支持hive:./make-distribution.sh --hadoop 2.3.0-cdh5.0.0 --with-yarn --with-hive - ...

  9. [Mysql]查看版本号的五种方式

    [Mysql]查看版本号的五种方式   目录(?)[+]   查看版本信息 #1 使用命令行模式进入mysql会看到最开始的提示符 Your MySQL connection id is 3Serve ...

  10. [Python] 拉格朗日插值

    #-*— coding:utf-8 -*- #Program 0.3 Lagrange Interpolation import matplotlib.pyplot as plt import num ...