POJ 1661 Help Jimmy(递推DP)
思路:
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)的更多相关文章
- POJ 1661 Help Jimmy(二维DP)
题目链接:http://poj.org/problem?id=1661 题目大意: 如图包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的 ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...
- 递推DP URAL 1167 Bicolored Horses
题目传送门 题意:k个马棚,n条马,黑马1, 白马0,每个马棚unhappy指数:黑马数*白马数,问最小的unhappy值是多少分析:dp[i][j] 表示第i个马棚放j只马的最小unhappy值,状 ...
- 递推DP URAL 1017 Staircases
题目传送门 /* 题意:给n块砖头,问能组成多少个楼梯,楼梯至少两层,且每层至少一块砖头,层与层之间数目不能相等! 递推DP:dp[i][j] 表示总共i块砖头,最后一列的砖头数是j块的方案数 状态转 ...
- 递推DP URAL 1260 Nudnik Photographer
题目传送门 /* 递推DP: dp[i] 表示放i的方案数,最后累加前n-2的数字的方案数 */ #include <cstdio> #include <algorithm> ...
- 递推DP URAL 1353 Milliard Vasya's Function
题目传送门 /* 题意:1~1e9的数字里,各个位数数字相加和为s的个数 递推DP:dp[i][j] 表示i位数字,当前数字和为j的个数 状态转移方程:dp[i][j] += dp[i-1][j-k] ...
- 递推DP URAL 1119 Metro
题目传送门 /* 题意:已知起点(1,1),终点(n,m):从一个点水平或垂直走到相邻的点距离+1,还有k个抄近道的对角线+sqrt (2.0): 递推DP:仿照JayYe,处理的很巧妙,学习:) 好 ...
- 递推DP 赛码 1005 Game
题目传送门 /* 递推DP:官方题解 令Fi,j代表剩下i个人时,若BrotherK的位置是1,那么位置为j的人是否可能获胜 转移的时候可以枚举当前轮指定的数是什么,那么就可以计算出当前位置j的人在剩 ...
- 递推DP HDOJ 5328 Problem Killer
题目传送门 /* 递推DP: 如果a, b, c是等差数列,且b, c, d是等差数列,那么a, b, c, d是等差数列,等比数列同理 判断ai-2, ai-1, ai是否是等差(比)数列,能在O( ...
随机推荐
- spring使用rssfeed
spring使用rssfeed import org.springframework.stereotype.Controller; import org.springframework.web.bin ...
- LeetCode: Merge Intervals 解题报告
Merge IntervalsGiven a collection of intervals, merge all overlapping intervals. For example,Given [ ...
- php memcached在windows上的使用
php的memcached是比memcache,效率更高的memcache缓存扩展. 然而windows下并没有这个扩展,于是做单元测试时要把代码上传到linux服务器,再运行,甚是麻烦. (当然另外 ...
- egret升级经验记录
1.StageDelegate.setDesignSize ; 直接去掉,在3.x里是直接在index.html里设置如: data-content-width="960" dat ...
- 【WPF】使用Popup控件做浮窗/提示框
需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作. 效果如下图: 当鼠标移入左上角的[多选显示]框内,出现下面的浮窗(悬浮在原UI之上).当在浮窗外点击鼠标左键时,隐藏该浮窗. 由于该 ...
- vlan pvid vid access口 trunk口
VLAN技术浅谈 http://www.h3c.com.cn/MiniSite/H3care_Club/Data_Center/Net_Reptile/The_One/Home/Catalog/ ...
- mysql编译安装后各种常见错误集锦
1.ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', sys ...
- Juint测试
添加"Juint测试"组件: 之后不用写在main方法里面便可以直接测试:
- tomcat http协议与ajp协议
AJP13是定向包协议.因为性能原因,使用二进制格式来传输可读性文本.WEB服务器通过 TCP连接和SERVLET容器连接.为了减少进程生成 socket的花费,WEB服务器和SERVLET容器之间尝 ...
- 探索Java语言与JVM中的Lambda表达式
Lambda表达式是自Java SE 5引入泛型以来最重大的Java语言新特性,本文是2012年度最后一期Java Magazine中的一篇文章,它介绍了Lamdba的设计初衷,应用场景与基本语法.( ...