思路:

1. 每个板子有左右两端, dp[i][0], dp[i][1] 分别记录左右端到地面的时间

2. 从下到上递推计算, 上一层的板子必然会落到下面的某一层板子上, 或者地面上

总结:

1. 计算每个板子的 dp[i][0/1] 仅需考虑该板子的直接前驱即可

2. 动规的思想并不很明显

3. 代码中, 两个板子相对位置的判断特别精髓

4. 将地面和初始状态都抽象成一块板子

代码:

#include <iostream>
#include <algorithm>
using namespace std; class board {
public:
int x1, x2, h;
board(int _x1, int _x2, int _h):x1(_x1), x2(_x2), h(_h){}
board() {
board(-1,-1,-1);
}
bool operator <(const board & other) const {
return this->h < other.h;
}
}; const int INF = 0X3F3F3F3F;
const int MAXN = 1010;
int t, N, X, Y, H, MAX;
board boards[MAXN];
int dp[MAXN][2]; int mainFunc() { for(int i = 0; i <= N+1; i ++) {
for(int j = i-1; j >= 0; j --) {
if(boards[i].x1 >= boards[j].x1 && boards[i].x1 <= boards[j].x2) { // i 的左端可以掉落到 j 上
int h = boards[i].h - boards[j].h;
if(h > MAX) dp[i][0] = INF;
else if (j == 0) dp[i][0] = h;
else
dp[i][0] = min(dp[j][0]+boards[i].x1-boards[j].x1, dp[j][1]+boards[j].x2-boards[i].x1) + h;
break;
}
}
for(int j = i-1; j >= 0; j --) {
if(boards[i].x2 >= boards[j].x1 && boards[i].x2 <= boards[j].x2) { // i 的右端可以掉到 j 上
int h = boards[i].h - boards[j].h;
if(h > MAX) dp[i][1] = INF;
else if(j == 0) dp[i][1] = h;
else
dp[i][1] = min(dp[j][0]+boards[i].x2-boards[j].x1, dp[j][1]+boards[j].x2-boards[i].x2) + h;
break;
}
}
}
return dp[N+1][1];
} int main() {
freopen("E:\\Copy\\ACM\\poj\\1661\\in.txt", "r", stdin);
cin >> t;
while(t-- >= 1) {
cin >> N >> X >> H >> MAX;
for(int i = 0; i < N; i ++) {
cin >> boards[i].x1 >> boards[i].x2 >> boards[i].h;
}
boards[N].x1 = -20010, boards[N].x2 = 20010, boards[N].h = 0;
boards[N+1].x1 = X, boards[N+1].x2 = X, boards[N+1].h = H;
sort(boards, boards+N+2);
// mainFunction
cout << mainFunc() << endl;
}
return 0;
}

  

update 2014年3月16日10:36:58

1. 直接前驱可以预处理得到

POJ 1661 Help Jimmy(递推DP)的更多相关文章

  1. POJ 1661 Help Jimmy(二维DP)

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

  2. poj 2229 【完全背包dp】【递推dp】

    poj 2229 Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 21281   Accepted: 828 ...

  3. 递推DP URAL 1167 Bicolored Horses

    题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...

  4. 递推DP URAL 1017 Staircases

    题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...

  5. 递推DP URAL 1260 Nudnik Photographer

    题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...

  6. 递推DP URAL 1353 Milliard Vasya's Function

    题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...

  7. 递推DP URAL 1119 Metro

    题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...

  8. 递推DP 赛码 1005 Game

    题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...

  9. 递推DP HDOJ 5328 Problem Killer

    题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O( ...

随机推荐

  1. 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)

    一.单片机下的中断处理 )分辨是哪一个中断 )调用处理函数 )清中断 二.linux下的中断处理 1)/arch/arm/kernel/irq.c asmlinkage void __exceptio ...

  2. .Net应该学什么怎么学(三)

    更新时间:2012年06月05日18时26分 来源:传智播客.Net 接上篇[我来解惑].Net应该学什么怎么学(二)七.HTML.JavaScript.Dom        HTML是对网页长什么样 ...

  3. 实战c++中的vector系列--构造、operator=和assign差别

    vector或许是实际过程中使用最多的stl容器.看似简单,事实上有非常多技巧和陷阱. 着重看一看vector的构造,临时依照C++11: default (1) explicit vector (c ...

  4. linux 内核参数调整优化网络

    Linux系统内核设置优化tcp网络,# vi /etc/sysctl.conf,添加以下内容 net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies.当出现SYN等待 ...

  5. Hbase 学习(一) hbase配置文件同步

    最近在狂啃hadoop的书籍,这部<hbase:权威指南>就进入我的视野里面了,啃吧,因为是英文的书籍,有些个人理解不对的地方,欢迎各位拍砖. HDFS和Hbase配置同步 hbase的配 ...

  6. Elasticsearch 5

    Elasticsearch 5常见问题解决方案     安装运行 1.前置安装java8 jdk-8u112-linux-x64.rpm 下载地址:http://www.oracle.com/tech ...

  7. linux 获取随机数的办法

    1.1.1 inux随机数的办法  http://www.2cto.com/kf/201410/342717.html 方法一.[root@ob ~]# date +%N  %N纳秒  随机获取的九位 ...

  8. mongo-查询(2)——比较/$in/$nin/$or/$not

    mongo通find来查找文档.可以执行精确匹配和模糊匹配. 2. 模糊匹配 2.1比较 > $gt , >= $gte, < $lt, <= $lte, != $ne > ...

  9. tab标签

    <ul class="nav nav-tabs" role="tablist" role="tablist" id="myT ...

  10. loadrunner循环执行某个动作

    1.action部分定义  int   i;  int   count; 2. 打算循环的代码前代码如下:   count=rand() % 8 +1;       for(i=0;i<coun ...