UVA1629Cake slicing(记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51190
紫书P305
题意分析:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃,问最少切割距离是?
解题思路:既然是切割蛋糕,可以感受到是一个无限切割的过程(递归?)反正有这种感觉存在。然后数据是20*20。那么就试试记忆化搜索。我们设dp[u][d][l][r]为u(up)为上届d(down)为下界,l为左界,r为右界的最小切割距离。边界就是当整块区域只有一个樱桃显然不用切割了,返回0。当整块区域没有樱桃时,这块区域就是无效的切割,设置为无穷。
弱逼没点想法,看了大神的题解顿时恍然大悟
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int n, m, dp[][][][];
bool has[][]; //记录格点是否有樱桃 int sum(int u, int d, int l, int r) //统计区域内的樱桃数
{
int total = ;
for(int i = u + ; i <= d; i++)
{
for(int j = l + ; j <= r; j++)
{
if(has[i][j])
total++;
if(total == ) //只要至少两个就得分割
return ;
}
}
return total;
} int dfs(int u, int d, int l, int r)
{
int &res = dp[u][d][l][r];
if(res != -)
return res;
int total = sum(u, d, l, r);
if(total == )
return res = ;
if(total == )
return res = INF;
res = INF; // 找res的最小,要先把他设成最大值
for(int i = u + ; i < d; i++)
res = min(res, dfs(u, i, l, r) + dfs(i, d, l, r) + (r - l)); //按行分割
for(int i = l + ; i < r; i++)
res = min(res, dfs(u, d, l, i) + dfs(u, d, i, r) + d - u); //按列分割
return res;
}
int main()
{
int test = ,k;
while(scanf("%d%d%d", &n, &m, &k) != EOF)
{
int x,y;
memset(has, , sizeof(has));
memset(dp, -, sizeof(dp));
for(int i = ; i < k; i++)
{
scanf("%d%d", &x, &y);
has[x][y] = ;
}
printf("Case %d: %d\n", ++test,dfs(, n, , m)); //上开下闭的区间
}
return ;
}
UVA1629Cake slicing(记忆化搜索)的更多相关文章
- UVa 1629  Cake slicing (记忆化搜索)
		
题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃,问最少切割距离是多少. 析:很容易知道是记忆化搜索,我们用dp[u][d][l][r]来 ...
 - uva1629,Cake Slicing,记忆化搜索
		
同上个题一样,代码相似度极高,或者说可以直接用一个模板吧 dp[i,j,p,q]表示一块长为j-i+1,宽为q-p+1,左上角在位置(i,j)上的蛋糕,dp[]表示当前状态下的最优值,然后对该块蛋糕枚 ...
 - [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
		
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
 - 【BZOJ-3895】取石子       记忆化搜索 + 博弈
		
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
 - hdu3555 Bomb (记忆化搜索 数位DP)
		
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
 - zoj 3644(dp + 记忆化搜索)
		
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
 - loj 1044(dp+记忆化搜索)
		
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
 - DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
		
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
 - HDU1978 记忆化搜索
		
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
 
随机推荐
- Gradle的安装
			
1.Gradle依赖JDK,所以先在机器上安装好JDK,设置好JAVA_HOME与PATH环境变量 2.从官网下载合适的Gradle发行包 3.发行包是一个zip文件,解压后,将 GRADLE_HOM ...
 - 浅析CSS——元素重叠及position定位的z-index顺序
			
多次在项目中遇到html页面元素的非期待重叠错误,多数还是position定位情况下z-index的问题.其实每次解决类似问题思路大致都是一样的,说到底还是对z-index的理解比较模糊,可以解决问题 ...
 - C++构造函数与析构函数
			
转自http://blog.csdn.net/tqtuuuu/article/details/6652144 构造函数 对于C++的构造函数,暂且将其分为以下几类: 1. 默认构造函数 2. 隐士转换 ...
 - linux修改网卡名称
			
本文转载自江一<linux修改网卡名称> 终端输入:vi /etc/udev/rules.d/70-persistent-net.rules 出现以下文件 # This file was ...
 - Caffe学习系列(5):其它常用层及参数
			
本文讲解一些其它的常用层,包括:softmax_loss层,Inner Product层,accuracy层,reshape层和dropout层及其它们的参数配置. 1.softmax-loss so ...
 - Django添加Last-Modified和ETag
			
用Django REST Framework做的REST API,其中有个API有这样的需求: APP端请求这个API,服务器端从数据库读数据,返回json.返回的数据量稍微有些大,但是可能一年才修改 ...
 - 启动图实现:UIScrollView+UIPageControl简单实现
			
#import "MJViewController.h"#import "RootViewController.h" @interface MJViewCont ...
 - PHP 系列:PHP Web 开发基础
			
PHP是动态类型的Web开发的脚本语言,PHP以页面文件作为加载和运行的单元,PHP现在有了Composer作为开发包管理. 1.使用Composer管理依赖 自从.NET开发用了Nuget管理程序集 ...
 - 记录我开始学习 Git的路程
			
工作半年多了,总觉得没学到什么东西,于是乎找了个Git学习一下,感觉还蛮厉害的样子.为此记录下我的路程 2015,11,26 更新 前面的路都挺艰难的,在官网下载msysgit网速几乎为0(心情千万只 ...
 - Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
			
公众号:smart_android 作者:耿广龙|loonggg 点击"阅读原文",可查看更多内容和干货 导语:沉浸式状态栏,改变状态栏的颜色使之与APP风格一体化是不是感觉很漂亮 ...