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( ...
随机推荐
- rman备份,恢复
ackup database format 'd:\tt\%U'; rman> restore database;rman> recover database; ============= ...
- js屏蔽键盘按键
3.1屏蔽键盘所有键 <script language="javascript"> <!-- function document.onkeydown(){ eve ...
- 一款基于TweenMax.js的网页幻灯片
之前介绍了好多网页幻灯片.今天给大家带来一款基于TweenMax.js的网页幻灯片.这款幻灯片以不规则的碎片百叶窗的形式切换.切换效果非常漂亮.一起看下效果图: 在线预览 源码下载 实现的代码. ...
- DatagridView内容自动换行和换行符换行
内容自动换行: 在 DataGridView 新增 Row 时,設定 DataGridView 的 DefaultCellStyle 屬性WrapMode=true: 换行符换行: 在 DataGri ...
- kubernetes service访问原理
k8s集群中有三类IP: 1:宿主机的物理网卡IP,比如192.168.255.* 2:cni创建的网卡的IP,比如172.16.*.* 3:虚拟的IP(即ClusterIP ,无法ping通,通过代 ...
- uboot中log处理
位图或logo和开机显示画面,是两个完全不同的东西. logo显示uboot相关信息,如版本号等. 开机画面是用户下载到固定位置后uboot加载的. 1.开机画面 在uboot中使用splash sc ...
- Yii 中Criteria常用方法
$criteria = new CDbCriteria; //select $criteria->select = '*';//默认* $criteria->select = 'id,na ...
- [LintCode]转换字符串到整数
问题描述: 实现atoi这个函数,将一个字符串转换为整数.如果没有合法的整数,返回0.如果整数超出了32位整数的范围,返回INT_MAX(2147483647)如果是正整数,或者INT_MIN(-21 ...
- Entity Framework应用:使用LINQ操作
一.什么是LINQ TO EntitiesLINQ,全称是Language-INtegrated Query(集成语言查询),是.NET语言中查询数据的一种技术.LINQ to Entities是一种 ...
- TensorFlow基础笔记(14) 网络模型的保存与恢复_mnist数据实例
http://blog.csdn.net/huachao1001/article/details/78502910 http://blog.csdn.net/u014432647/article/de ...