LA 6042 Bee Tower 记忆化搜索
一开始读漏了很多细节,用递推写死活跑不出样例。
把题目中的细节列一下吧,状态方程很好推,改成记忆化搜索之后代码也很清晰。
1.蜜蜂需要到最高的塔去,最高的塔可能不止一个,抵达任意一个即可。
2.蜜蜂每次只能到达相邻的塔,满足的条件为横向移动距离<=W,下一个塔高 <= 上一个塔高 + H。
3.蜜蜂可以选择任意高度小于等于H的塔作为起始塔。
4.塔可以移动,但是塔之间的相对位置不变。只有最高的塔是不能移动的。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm> using namespace std; const int MAXN = ;
const int INF = << ; struct tower
{
int id;
int p, h;
}; tower Tw[MAXN];
int dp[MAXN][];
int cost[MAXN][]; // 把 tower[i] 移动到 位置j 所需要的代价
int N, H, W;
int maxH; bool cmp( tower a, tower b )
{
if ( a.p == b.p ) return a.id < b.id;
return a.p < b.p;
} int DpLeft( int cur, int addr, int preH )
{
if( cur == ) return INF; int &res = dp[cur][addr];
if ( res != - ) return res; if ( Tw[cur].h + H < preH ) return INF;
if ( Tw[cur].h <= H ) return cost[cur][addr]; res = INF;
for ( int j = addr; j >= addr - W && j > ; --j )
{
res = min( res, DpLeft( cur - , j, Tw[cur].h ) + cost[cur][addr] );
} //printf( "dp[%d][%d]=%d\n", cur, addr, res );
return res;
} int DpRight( int cur, int addr, int preH )
{
if ( cur > N ) return INF; int &res = dp[cur][addr];
if ( res != - ) return res; if ( Tw[cur].h + H < preH ) return res = INF;
if ( Tw[cur].h <= H ) return cost[cur][addr]; res = INF;
for ( int j = addr; j <= addr + W && j <= ; ++j )
res = min( res, DpRight( cur + , j, Tw[cur].h ) + cost[cur][addr] ); return res;
} int main()
{
//freopen( "in.txt", "r", stdin );
//freopen( "s.out", "w", stdout );
int T, cas = ;
scanf( "%d", &T );
while ( T-- )
{
scanf( "%d%d%d", &N, &H, &W );
maxH = -;
for ( int i = ; i <= N; ++i )
{
scanf( "%d%d", &Tw[i].p, &Tw[i].h );
Tw[i].id = i;
if ( Tw[i].h > maxH ) maxH = Tw[i].h;
} sort( Tw + , Tw + N + , cmp );
for ( int i = ; i <= N; ++i )
for ( int j = ; j <= ; ++j )
cost[i][j] = abs( Tw[i].p - j ) * Tw[i].h; int ans = INF; for ( int i = ; i <= N; ++i )
{
if ( Tw[i].h == maxH )
{
memset( dp, -, sizeof(dp) );
ans = min( ans, DpLeft( i, Tw[i].p, Tw[i].h ) ); memset( dp, -, sizeof(dp) );
ans = min( ans, DpRight( i, Tw[i].p, Tw[i].h ) ); }
} printf( "Case #%d: ", ++cas );
if ( ans >= INF ) puts("-1");
else printf( "%d\n", ans ); }
return ;
}
LA 6042 Bee Tower 记忆化搜索的更多相关文章
- LA 3516 Exploring Pyramids (记忆化搜索)
题意 给定一个DFS序列,问能有多少树与之对应. 思路 设输入序列为S,dp(i, j)为子序列Si, Si+1, --, Sj对应的树的个数,则边界条件为d(i, i) = 1,且Si != Sj时 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- 【UVA 437】The Tower of Babylon(记忆化搜索写法)
[题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...
- HDU 4597 Play Game (DP,记忆化搜索,博弈)
题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个,只能从其中一个序列,选择两端中的一个拿走.他们都希望可以拿到尽量大的数字之和, 并且他们都足够聪明,每次都选择最优策略 ...
- UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)
描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- SCOI2008着色方案(记忆化搜索)
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...
- NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
随机推荐
- mysql导入的时候提示“1046-No Database selected”的解决办法
进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...
- Oracle中的通配符
这是scott用户下的EMP表 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 1980/12/17 800 ...
- CentOS 6.3 配置 yum
ContOS 配置yum:1.cd /etc/yum.repos.d2.创建个任意目录,将所有文件移动到创建的目录中,除了CentOS-Media.repo3.编辑CentOS-Media.repov ...
- Android修改system只读权限
在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...
- mysql日志文件
mysql的数据文件夹里出现mysql-bin日志文件,通过my.cnf注释掉log后,是否可以删除了? 参考 http://database.51cto.com/art/201107/278988. ...
- CentOS 6.5系统上安装MySQL数据库
1.查看系统是否安装了MySQL 使用命令: #rpm -qa | grep mysql 2.卸载已安装的MySQL 卸载mysql命令如下: #rpm ...
- 【转】如何设置Android软键盘的默认不弹出?
在开发Anroid的时候,当你打开一个界面的时候,屏幕的焦点会自动停留在第一个EditText中,Android的软键盘默认会自动弹出,用户第一眼连界面都没有看清楚,软键盘就弹出来了,这就影响到了用户 ...
- MVC3 ModelBinder
1.Model Binder从哪些地方获取数据(找到数据后会停止继续寻找) MVC 框架内置默认的 Model Binder 是 DefaultModelBinder 类.当 Action Invok ...
- table 与 div 固定宽高问题
div {width:100px;height:200px;word-wrap: break-word;overflow:hidden;} 这个可以固定div的宽高,溢出内容会被剪除. table{t ...
- java基础知识回顾之---java String final类构造方法
/** * String 构造方法学习 * String(byte[ ] bytes):通过byte数组构造字符串对象. * String(byte[] bytes, int offs ...