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

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

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. 用Python作GIS之一:介入STARS

    STARS的全称是Space-Time Analysis of Regional Systems,直译过来就是区域系统时空分析软件.这是针对区域多时相数据的分析包,源代码公开.该软件将最近几年发展起来 ...

  2. php正则表达式判断是否为ip格式

    <?php $a = '127.0.0.111'; $b = preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$a); ...

  3. DataGridView 使用CheckBox选中行

    在winform中使用checbox很多.上次那个项目里就用到了,写了一个不太好用,后来翻阅了一下微软提供的样码,我觉得有必要给大家分享一下. // This event handler manual ...

  4. SNV ConnerStore使用说明

    1.  上传自己新建的文件新建的类文件 后面的 会有A标示要先 Add To Working copy 再点击提交 2. 上传第三方库时 默认SVN是忽略.a文件的要找到.a文件把他设置成不是忽略的通 ...

  5. NET免费服务器

    NET免费服务器 1.先注册一个号.地址:https://appharbor.com/ 2.看看有没有你需要的插件,基本上都是免费的 3.本地创建git库 4.复制git远程仓库的地址 5.推送到远程 ...

  6. margin-top相对谁的问题

    根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边距重叠.意思便是:如果你只想margin相对于父标 ...

  7. Java工程转换为Maven工程-b

    1. 前言 在开发中经常要建立一个Maven的子工程,对于没有模板的同学来说从Java工程来转换也是一个不错的选择.本文就如何从一个Java工程创建一个Maven工程做了一个介绍,相信对于将一个Jav ...

  8. android 开发不能创建目录

    原来代码: File tempDir = new File(path); //path 是一个参数 if (!tempDir.exists()) { try { tempDir.mkdir(); // ...

  9. [algorithm]求最长公共子序列问题

    最直白方法:时间复杂度是O(n3), 空间复杂度是常数 reference:http://blog.csdn.net/monkeyandy/article/details/7957263 /** ** ...

  10. Sublime text 取消记住上一次打开的,这功能太墨迹了!

    比较恨,这sublime text的配置全部都是配置文件. 选择菜单:Preferences->Settings-User,增加配置项 //热退出,其实实现一种模拟没有退出的状态,当程序再次启动 ...