一开始读漏了很多细节,用递推写死活跑不出样例。

把题目中的细节列一下吧,状态方程很好推,改成记忆化搜索之后代码也很清晰。

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 记忆化搜索的更多相关文章

  1. LA 3516 Exploring Pyramids (记忆化搜索)

    题意 给定一个DFS序列,问能有多少树与之对应. 思路 设输入序列为S,dp(i, j)为子序列Si, Si+1, --, Sj对应的树的个数,则边界条件为d(i, i) = 1,且Si != Sj时 ...

  2. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

  3. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  4. HDU 4597 Play Game (DP,记忆化搜索,博弈)

    题意:Alice和Bob玩一个游戏,有两个长度为N的正整数数字序列,每次他们两个,只能从其中一个序列,选择两端中的一个拿走.他们都希望可以拿到尽量大的数字之和, 并且他们都足够聪明,每次都选择最优策略 ...

  5. UVA_437_The_Tower_of_the_Babylon_(DAG上动态规划/记忆化搜索)

    描述 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  6. SCOI2008着色方案(记忆化搜索)

    有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...

  7. NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...

  8. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  9. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

随机推荐

  1. mysql导入的时候提示“1046-No Database selected”的解决办法

    进入phpmyadmin后,先点击左边的要导入的数据库,进入后再点击右上角的“导入‘按钮即可 详细说明 http://www.xmxwl.net/help/member/20160325/13653. ...

  2. Oracle中的通配符

    这是scott用户下的EMP表 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7369 SMITH CLERK 7902 1980/12/17 800   ...

  3. CentOS 6.3 配置 yum

    ContOS 配置yum:1.cd /etc/yum.repos.d2.创建个任意目录,将所有文件移动到创建的目录中,除了CentOS-Media.repo3.编辑CentOS-Media.repov ...

  4. Android修改system只读权限

    在Root后的真机上使用adb remount命令不知道为什么不行. 但有些时候还是想向system文件夹下面写文件,例如把tcpdump工具放到/system/bin 下面,然后就可以直接使用tcp ...

  5. mysql日志文件

    mysql的数据文件夹里出现mysql-bin日志文件,通过my.cnf注释掉log后,是否可以删除了? 参考 http://database.51cto.com/art/201107/278988. ...

  6. CentOS 6.5系统上安装MySQL数据库

    1.查看系统是否安装了MySQL      使用命令:      #rpm -qa | grep mysql 2.卸载已安装的MySQL       卸载mysql命令如下:        #rpm ...

  7. 【转】如何设置Android软键盘的默认不弹出?

    在开发Anroid的时候,当你打开一个界面的时候,屏幕的焦点会自动停留在第一个EditText中,Android的软键盘默认会自动弹出,用户第一眼连界面都没有看清楚,软键盘就弹出来了,这就影响到了用户 ...

  8. MVC3 ModelBinder

    1.Model Binder从哪些地方获取数据(找到数据后会停止继续寻找) MVC 框架内置默认的 Model Binder 是 DefaultModelBinder 类.当 Action Invok ...

  9. table 与 div 固定宽高问题

    div {width:100px;height:200px;word-wrap: break-word;overflow:hidden;} 这个可以固定div的宽高,溢出内容会被剪除. table{t ...

  10. java基础知识回顾之---java String final类构造方法

    /** * String 构造方法学习 *     String(byte[ ] bytes):通过byte数组构造字符串对象. *     String(byte[] bytes, int offs ...