题意略。

思路:

很有意思的一个题,我采用的是主动更新未知点的方式,也即刷表法来dp。

我们可以把整个路径划分成横向移动和纵向移动,题目一开始就给出了Jimmy的高度,这就是纵向移动的距离。

我们dp的目标是每个线段端点的横向移动最小值。

有一个小trick,就是有可能Jimmy开始就可以落在地上,没有必要或者说在下落过程中不会有间隔来阻拦。

代码附上:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f;
const int F = 0x3f; struct segment{
int l,r,h;
segment(int l = ,int r = ,int h = ){
this->l = l,this->r = r,this->h = h;
}
}; segment store[maxn];
int dp[maxn<<],N,x,h,MAX,t;
bool covered[maxn<<]; bool cmp(const segment& s0,const segment& s1){
return s0.h > s1.h;
}
bool inSegment(int x,segment s){
return s.l <= x && x <= s.r;
} int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&N,&x,&h,&MAX);
for(int i = ;i < N;++i) scanf("%d%d%d",&store[i].l,&store[i].r,&store[i].h);
memset(dp,F,sizeof(dp));
memset(covered,false,sizeof(covered));
sort(store,store + N,cmp);
int ans = h,lft,rht,lp,rp,nlft,nrht,nlp,nrp;
for(int i = ;i < N;++i){
lft = i<<,rht = lft + ;
if(inSegment(x,store[i])){
dp[lft] = x - store[i].l,dp[rht] = store[i].r - x;
break;
}
}
for(int i = ;i < N;++i){
lft = i<<,rht = lft + ;
lp = store[i].l,rp = store[i].r;
int cnt0 = ,cnt1 = ;
if(dp[lft] == INF) continue;
for(int j = i + ;store[i].h - store[j].h <= MAX && j < N && cnt0 + cnt1 < ;++j){
if(store[i].h == store[j].h) continue;
nlft = j<<,nrht = nlft + ;
nlp = store[j].l,nrp = store[j].r;
if(!cnt0 && inSegment(lp,store[j])){
dp[nlft] = min(dp[nlft],dp[lft] + lp - nlp);
dp[nrht] = min(dp[nrht],dp[lft] + nrp - lp);
cnt0 = ;
}
if(!cnt1 && inSegment(rp,store[j])){
dp[nlft] = min(dp[nlft],dp[rht] + rp - nlp);
dp[nrht] = min(dp[nrht],dp[rht] + nrp - rp);
cnt1 = ;
}
}
} for(int i = ;i < N;++i){
if(store[i].h > MAX) continue;
for(int j = i + ;j < N;++j){
if(inSegment(store[i].l,store[j])) covered[i<<] = true;
if(inSegment(store[i].r,store[j])) covered[i<< | ] = true;
}
} int minn = INF;
for(int i = N - ;i >= && store[i].h <= MAX;--i){
lft = i<<,rht = lft + ;
if(!covered[lft]) minn = min(minn,dp[lft]);
if(!covered[rht]) minn = min(minn,dp[rht]);
}
if(minn == INF) minn = ;
ans += minn;
printf("%d\n",ans);
}
return ;
} /* 1
3 4 4 5
3 5 3
1 7 2
2 6 1
*/

POJ 1661 暴力dp的更多相关文章

  1. POJ 1661 Help Jimmy(递推DP)

    思路: 1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间 2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上 总结: 1. 计 ...

  2. E - Help Jimmy POJ - 1661 dp

    E - Help Jimmy POJ - 1661 这个题目本身不是很难,但是可以更加优化这个写法. 开始是n*n #include <cstdio> #include <cstri ...

  3. POJ 2182/暴力/BIT/线段树

    POJ 2182 暴力 /* 题意: 一个带有权值[1,n]的序列,给出每个数的前面比该数小的数的个数,当然比一个数前面比第一个数小的个数是0,省略不写,求真正的序列.(拗口) 首先想到的是从前到后暴 ...

  4. Luogu P1436 棋盘分割 暴力DP

    我的天,,,,,n=8,k<=15,,,这怕不是暴力DP+高维数组.... 开一个五维数组f[k][i][j][p][q]表示从(i,j)到(p,q)中分成k个矩形最小的平方和. 然后初始化时用 ...

  5. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  6. 暴力/DP Codeforces Beta Round #22 (Div. 2 Only) B. Bargaining Table

    题目传送门 /* 题意:求最大矩形(全0)的面积 暴力/dp:每对一个0查看它左下的最大矩形面积,更新ans 注意:是字符串,没用空格,好事多磨,WA了多少次才发现:( 详细解释:http://www ...

  7. 【2019.8.8 慈溪模拟赛 T1】开箱(chest)(暴力DP水过)

    转化题意 这题目乍一看十分玄学,完全不可做. 但实际上,假设我们在原序列从小到大排序之后,选择开的宝箱编号是\(p_{1\sim Z}\),则最终答案就是: \[\sum_{i=1}^Za_{p_i} ...

  8. 【2019.8.12 慈溪模拟赛 T1】钥匙(key)(暴力DP)

    暴力\(DP\) 这题做法很多,有\(O(n^2)\)的,有\(O(n^2logn)\)的,还有徐教练的\(O(nlogn)\)的,甚至还有\(bzt\)的二分+线段树优化建图的费用流. 我懒了点,反 ...

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

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

随机推荐

  1. Ambassador,云原生应用的“门神”

    目前,行业内基于云原生思想的开源项目,重点在于管理.控制微服务以及微服务架构下服务之间的通信问题.它们有效的解决了“服务异构化”.“动态化”.“多协议”场景所带来的east/west流量的管控问题,而 ...

  2. 基于ZK的 Dubbo-admin 与 Dubbo-monitor 搭建

    背景 最近项目中使用了 dubbo 在实现服务注册和发现,需要实现对服务提供者和调用者的监控,之前有研究过基于 redis作为注册中心的监控平台,不过本文基于 zk 作为注册中心,进行 dubbo-a ...

  3. 使用.net core基于Razor Pages开发网站一些工作笔记

    本文是在实践工作中遇到的一些问题记录,并给出是如何解决的,.net core已经升级到3.0版本了,其实在项目中很早就已经在使用.net core来开发后台接口了,正好有个网站项目,就使用了Razor ...

  4. 【杂谈】Hash表与平衡树

    hash表与平衡树查询数据的时间复杂度是多少? hash表为O(1),平衡树为O(logn) 这个时间复杂度是如何得出的? 时间复杂度是按照最糟糕的情况来的.但即使是最糟糕的情况,hash表也只需要计 ...

  5. C#汽车租赁系统 完整版

      Truck.cs类 //卡车类 public class Truck : Vehicle1 { //重载 public int Load { get; set; } //构造函数 public T ...

  6. Deque 和Queue

    概述 接口,一个线性结合,支持在集合首尾add , remove , deque 是double  ended queue 的缩写,意味双端队列,接口提供的方法有两种类型,如果失败,一种抛出异常,一种 ...

  7. perspective transform透视矩阵快速求法+矩形矫正

    算了半天一直在思考如何快速把矩阵算出来,网上基本都是在说边长为1的正方形的变换方式=.=   不怎么用得上…… 公式推导推半天,计算还麻烦.... ++++++++++++++++++++++++++ ...

  8. 金蝶K3 V12.2版本,对已发生业务单据的物料启用辅助计量单位

    /****************************************************************************** 联达双计量单位 yLD_K3Data_S ...

  9. SpringBoot底层原理及分析

    一,Spring Boot简介 1.什么是Spring Boot: SpringBoot是由Pivotal团队提供的框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. 该框架使用了特 ...

  10. ES 23 - 检索和过滤的区别 (query vs. filter)

    目录 1 filter与query示例 1.1 准备测试数据 1.2 搜索测试 2 filter与query的区别 2.1 相关度处理上的不同 2.2 性能上的对比 2.3 对比结论 本文以 ES 6 ...