/*

【过滤这一段~~~】

一开始想的【错误的,为自己的总结的写的,读者略过】:

每个状态的点肯定是高度,那么我DP每一层,这样的话就有一层循环,其实这无关复杂度,不会很多时间

错误的是想法是从最高层开始DP下来,或者其实这样也同样可行,最高点是固定的。

OK,那么中间呢?怎么考虑一段,我们的目标且只能站在平台上,所以DP每个位置是不现实也是错误的想法。

最终只需要考虑两端?其实对啊,真的就只要两端考虑一下就好了!!!中间何必呢,自找麻烦,如果我是

sort了从高到低其实也好写,但是错就错在DP的位置是每一米的高度,如果这个高度没有平台,那不就是自找没趣?

所以我每次就以平台作为目标,因为平台是不会重叠,那么对象就看做平台好了。

*/

因为现在还很弱,这种左右分开DP真的太难想到了,当然也没有去仔细想,急着想水过去,就看了题解。【这样是不对的】

解析:

对象就是每一段平台,然后添两个平台,一个是地面,一个是最高点。排序由高度从小到大,所以处理的是从最低到最高的DP

当我掉在平台上的时候,我只能左走,或右走,走到左右两端的时间是好算的,

那么DP左右点的时间就是取复合要求的那些平台的DP值加上高度值和平移值;

第一:题目有要求,两个平台的高度不能超过max,

第二题目也有条件,高度各不相同,那么我们排序过以后,也就是说数组下标小的那些平台的高度一定是比他低的。

第三:他的下落点肯定是夹在接着的平台两端里面。

第四:我们一旦比他低的平台的,状态转移好就好结束,因为。。。自己想。。。

第五:他的下面可能没找什么平台,题目有解,那么就是他的高度呗。

状态转移方程不写了。。。。。后面其实写写真的很轻松了。

简述:

存入每一段,排序一下

然后for一层,哦,DP是DP[i][0]代表第i段左端的最少时间/DP[i][1]第i段右端最短的时间。

左右两端都要DP一下,DP的条件啊,转化啊,都说了,巨巨自己写写吧!!!加油!!!

参考的大牛博客: http://blog.csdn.net/jdplus/article/details/19919531

#include<iostream>
#include<cstdio>
#include<math.h>
#include<queue>
#include<map>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
const int N=1e4+10; int dp[N*4][4]; struct asd{
int x1,x2;
int h;
};
asd q[1010];
int n,tp;
bool cmp(asd z,asd x)
{
if(z.h<x.h)
return 1;
return 0;
} void left_t(int i)
{
int k=i-1;
while(k>0&&(q[i].h-q[k].h)<=tp){
if(q[i].x1>=q[k].x1&&q[i].x1<=q[k].x2){
dp[i][0]=(q[i].h-q[k].h)+min(q[i].x1-q[k].x1+dp[k][0],q[k].x2-q[i].x1+dp[k][1]);
return;
}
else
--k;
}
if((q[i].h-q[k].h)>tp)
dp[i][0]=INF;
else
dp[i][0]=q[i].h;
}
void right_t(int i)
{
int k=i-1;
while(k>0&&(q[i].h-q[k].h)<=tp){
if(q[i].x2<=q[k].x2&&q[i].x2>=q[k].x1){
dp[i][1]=(q[i].h-q[k].h)+min(q[i].x2-q[k].x1+dp[k][0],q[k].x2-q[i].x2+dp[k][1]);
return;
}
else
--k;
}
if((q[i].h-q[k].h)>tp)
dp[i][1]=INF;
else
dp[i][1]=q[i].h;
} int smallest()
{
int i,j;
for(int i=1;i<=n+1;i++){
left_t(i);
right_t(i);
}
return min(dp[n+1][0],dp[n+1][1]);
} int main()
{
int T,k;
int x0,y0,i,j;
cin>>T;
while(T--){
cin>>n>>x0>>y0>>tp;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&q[i].x1,&q[i].x2,&q[i].h);
}
q[0].h=0;
q[0].x1=-20000;
q[0].x2=20000;
q[n+1].h=y0;
q[n+1].x1=x0;
q[n+1].x2=x0;
sort(q,q+n+2,cmp);
printf("%d\n",smallest());
}
return 0;
}

poj1661【DP,左右两端dp】的更多相关文章

  1. CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)

    问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...

  2. Beans(dp,两次dp)

    Beans Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  3. DP:树DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  4. C. Multiplicity 简单数论+dp(dp[i][j]=dp[i-1][j-1]+dp[i-1][j] 前面序列要满足才能构成后面序列)+sort

    题意:给出n 个数 的序列 问 从n个数删去任意个数  删去的数后的序列b1 b2 b3 ......bk  k|bk 思路: 这种题目都有一个特性 就是取到bk 的时候 需要前面有个bk-1的序列前 ...

  5. kuangbin带你飞dp专题-基础dp

    dp HDU - 1257 最少拦截系统 最长递增子序列 #include<iostream> using namespace std; const int maxn=1e7; int a ...

  6. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  7. 51nod 1673 树有几多愁(链表维护树形DP+状压DP)

    题意 lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出 ...

  8. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  9. DP系列——树形DP(Codeforces543D-Road Improvement)

    一.题目链接 http://codeforces.com/problemset/problem/543/D 二.题意 给一棵树,一开始所有路都是坏的.询问,以每个节点$i$为树根,要求从树根节点到其他 ...

随机推荐

  1. lua 暂停写法

    由于lua 不支持暂停 用其他方法变相实现 -- 暂停 hock 写法 function _M.sleep(n) if n > 0 then os.execute("ping -c & ...

  2. ubuntu 16.04 更新后搜狗输入法无法输入中文的问题

    方法一:重启搜狗输入法 通过下面的两个命令重启搜狗输入法,看重启后是否可以正常使用: ~$ killall fcitx  ~$ killall sogou-qinpanel   方法二:检查修复安装依 ...

  3. VC中常见API函数使用方法(经验版)

    ***********************************************声明*************************************************** ...

  4. innodb 乐观插入因空间不够导致失败,进入悲观插入阶段,这个空间的大小限制

    btr_cur_optimistic_insert{ ... /*检查分裂页时是否有足够的空间预留给未来记录的update*/ if (leaf && !zip_size && ...

  5. linux输入子系统(5) - 学习框架

    注:本系列转自: http://www.ourunix.org/post/290.html input子系统学习系列文章,是我在实际开发过程中遇到也是必须啃下去的第一个Linux驱动,所以有必要记载下 ...

  6. webdriver.close() quit() 批量kill进程 内存耗尽的解决办法

    问题现象: shell窗口卡,换IP的登录窗,不开: 猜测: 内存耗尽 spider_url,py driver = webdriver.PhantomJS( executable_path='/us ...

  7. 【酷Q&C++】如何利用酷Q制作一个机器人?

    ——酷Q Air教程 要想阅读本篇教程,读者需要基本的C++知识以及Visual Studio 2010/2015/2017 首先,需要从官方网站下载软件 https://cqp.cc/t/23253 ...

  8. OO的片段,继承与组合,继承的优点与目的,虚机制在构造函数中不工作

    摘自C++编程思想: ------------------------------ 继承与组合:接口的重用 ------------------------------- 继承和组合都允许由已存在的类 ...

  9. HDOJ 5045 Contest

    状压DP.. . . Contest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  10. Parallels Desktop 设置win网络连接

    目的: 1 虚拟机中的win系统技能访问外网 2 可以和Mac系统互联 首先来实现1,很简单: 打开控制中心对应系统的设置 选择[硬件]->[网络] 源:设置共享网络 到此就达到1目的了: 现在 ...