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 ...
随机推荐
- JPages分页插件的使用
废话不多说,直接上代码. 首先下载JPages的js和css包,附上下载地址:http://dl.oschina.net/softfile/jpages/jpages-latest-138554713 ...
- 微软职位内部推荐-Enterprise Architect - BDE - BJ
微软近期Open的职位: Enterprise ArchitectCloud, HTML5, Big Data and Mobile are technology trends driving pro ...
- VBS基础篇 - FileSystemObject对象
文件系统是所有操作系统最重要的部分之一,脚本经常会需要对文件及文件夹进行访问和管理,在Vbs中对桌面和文件系统进行访问的顶级对象是FileSystemObject FSO包含的常见对象有: ...
- Leetcode-Read N Characters Given Read4 II
The API: int read4(char *buf) reads 4 characters at a time from a file. The return value is the actu ...
- android开发 socket接收图片并保存
逻辑:接收到socket之后需要将socket发送的图片数据保存下来并通知handler更新界面 关键代码: public void readImage(Socket socket) { try { ...
- Unity3D WP8发布解决方案名 DefaultPackageName 修改问题
原地址:http://blog.csdn.net/w337198302/article/details/16960661 在对Unity3D游戏进行Windows phone 8 发布的时候,首先是需 ...
- jstl if条件判断字符串代码
<c:if test="${netWorkInfo.networkType eq '快修店'}"> <input type="radio" n ...
- C# 委托的”四步走“
看了一本<深入了解C#>感觉很不错,对于委托的讲解,给大家摘录了下来! 1.什么是委托 我的拙见:委托就是将方法作为参数,进行传递的 书中的记载:将某种行为“包含”在一个对象中,这个对象可 ...
- JsRender系列demo(3)-自定义容器
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 彷徨中的成长-记一个文科生的IT成长过程
纠结了许久,要不要写这篇文章,然而最终还是写了.就权当总结与呻吟吧..当然,呻吟最开始还是发在自己的站点的,忍不住手贱,还是想发博客园. 1 剧透 人算不如天算:时隔多年,我竟然搞起了前端. 2 发端 ...