1629 - Cake slicing(DP)
花了近2个小时终于AC,好爽。。
一道类似于最优矩阵链乘的题目,受《切木棍》那道题的启示,该题的原理也是一样的,仅仅只是变成了且面积。那么对应的也要添加维度 。
显然要完整的表示状态,最少要用四维数组。分别表示它的两个对角线顶点的坐标 。 然后横切或者纵切,递归需找更小的矩形,直到矩形内仅仅剩一个樱桃的时候返回0
那么问题就是如何高速的推断一个矩形内有多少个樱桃,于是决定再开一个数组记录这个矩形内樱桃的个数。一開始就是在这个地方超时(开了个五重循环) ,后来想到一个折中的办法,将时间复杂度分散开 。
受到高效那章求区间和的方法,我们能够先用一个二维数组求出每一行的每一个区间内樱桃的个数,这样就将时间复杂度大大减少了 。
本来以为这样会非常快,结果好像也不快,其它人在递归的时候求的樱桃个数居然也过了。
。或许是由于用记忆化搜索递归会剪掉非常多不必要的计算 。
细节參见代码:
#include<bits/stdc++.h>
using namespace std;
const int INF = 1000000;
int n,m,k,maxn = 0,d[22][22][22][22],cnt[22][22][22][22],f[22][22];
struct point{
int x,y;
}c[405];
int dp(int ux,int uy,int dx,int dy) {
int& ans = d[ux][uy][dx][dy];
if(cnt[ux][uy][dx][dy] == 1) return 0;//递归边界
if(ans >= 0) return ans;
ans = INF;
if(uy != dy) for(int i=uy;i<=dy;i++) { //纵切
if(cnt[ux][uy][dx][i]>0 && cnt[ux][i][dx][dy]>0)
ans = min(ans,dp(ux,uy,dx,i)+dp(ux,i+1,dx,dy) + dx - ux + 1);
}
if(ux != dx) for(int i=ux;i<=dx;i++) { //横切
if(cnt[ux][uy][i][dy]>0 && cnt[i][uy][dx][dy]>0)
ans = min(ans,dp(i+1,uy,dx,dy) + dp(ux,uy,i,dy) + dy - uy + 1);
}
return ans;
}
void init() {
for(int i=1;i<=k;i++) {
for(int r=1;r<=n;r++) {
for(int j=1;j<=m;j++) {//先求出每一行的樱桃个数
if(c[i].x == r && c[i].y <= j) f[r][j]++;
}
}
}
for(int ux=1;ux<=n;ux++) {
for(int uy=1;uy<=m;uy++) {
for(int dx=ux;dx<=n;dx++) {
for(int dy=uy;dy<=m;dy++) {
int v = 0;
for(int i=ux;i<=dx;i++) {
v += f[i][dy] - f[i][uy-1]; //分别求出一部分答案。将时间复杂度分散
}
cnt[ux][uy][dx][dy] = v;
}
}
}
}
}
int main() {
while(~scanf("%d%d%d",&n,&m,&k)) {
memset(f,0,sizeof(f));
memset(d,-1,sizeof(d));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=k;i++) scanf("%d%d",&c[i].x,&c[i].y);
init();
printf("Case %d: %d\n",++maxn,dp(1,1,n,m));
}
return 0;
}
1629 - Cake slicing(DP)的更多相关文章
- UVA-1629 Cake slicing (DP、记忆化搜索)
题目大意:一块n*m的矩形蛋糕,有k个草莓,现在要将蛋糕切开使每块蛋糕上都恰有一个(这意味着不能切出不含草莓的蛋糕块)草莓,要求只能水平切或竖直切,求最短的刀切长度. 题目分析:定义状态dp(xa,y ...
- uva 1629切蛋糕(dp)
有一个n行m列的网格蛋糕,上面有一些樱桃.求使得每块蛋糕上都有一个樱桃的分割最小长度 思路:dp. #include<cstdio> #include<cstring> #in ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
随机推荐
- 七、C# 接口
并非只能通过继承使用多态性,还能通过接口使用它. 和抽象类不同,接口不包含任何实现(方法). 然后和抽象类相似,接口也定义了一系列成员,调用者可以依赖这些成员来支持一个特定的功能. 实现接口的类会 ...
- 五、C# 类
面向对象编程 类是面向对象编程的3个主要特征---封装.继承和多态性---的基础. 封装允许隐藏细节. 继承 继承关系至少涉及两个类,其中一个类(基类)是另一个类的更泛化的版本. 为了从一 ...
- C# 深入浅出 委托与事件
C#中的委托和事件的概念接触很久了,但是一直以来总没有特别透彻的感觉,现在我在这里总结一下: 首先我们要知道委托的由来,为什么要使用委托了? 我们先看一个例子: 假设我们有这样一个需求,需要计算在不同 ...
- Unable to locate package错误解决办法
新装了VMWare Player,结果装上Ubuntu12.04后安装软件都提示:Unable to locate package错误,解决方法非常简单,终端输入以下命令即可: sudo apt-ge ...
- Neutron/ML2学习
Neutron/ML2 Neutron ML2 模块层2(ml2)插件是一种允许OpenStack网络同时地利用在复杂现实数据中心发现的各种第二层网络技术的框架.目前它与存在的openvswitch. ...
- WireShark过滤语法
1.过 滤IP,如来源IP或者目标IP等于某个IP 例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107或者ip.addr eq 192.168. ...
- 10 款强大的JavaScript图表图形插件推荐
转自:http://www.iteye.com/news/24535 网上有很多用于绘制图表图形的免费JavaScript插件和图表库,这类插件大量出现的原因,一是人们不再依赖于Flash,二是浏览器 ...
- CSS3中更灵活的布局方式
flex是一个灵活性强的布局方式,它能够很好的控制内部元素的宽度,高度或者剩余的空间部分,来适应不同的显示设备和不同的屏幕尺寸,而真正达到一种自适应效果. flex布局与常规布局截然不同,常规布局虽然 ...
- a便签 rel属性改变链接打开页面的方式
<body> XHTML: <a href="http://www.baidu.com" rel="external">Baidu &l ...
- php中const定义常量
const 常量 1.在定义时必须被初始值,2.前面不加任何修饰符3.变量名字母一般都大写4.常量可以被子类继承5.一个常量是属于一个类的,而不是某个对象的 作用:当某些值是固定不变的,就用const ...