POJ 1191 记忆化搜索
(我是不会告诉你我是抄的http://www.cnblogs.com/scau20110726/archive/2013/02/27/2936050.html这个人的)
一开始没有想到要化一下方差的式子 怎么搞都挂……
尴尬
/*
题目固定是8*8,本来想用点的坐标来表示矩形的,但是发现用标号来表示会方便一点
对于最小的小方格,用(i,j)表示,即第i行第j列的小方格,注意不是点的坐标
所以对于一个矩形,我们用它左上角的小方格和右下角的小方格来表示
例如,整个棋盘就是(1,1),(8,8)
另外题目要求,每次分割出一个矩形后,剩下的也必须是矩形
那么其实每次分割只能切一刀,如果是切两刀得到的矩形,那么剩下的就不会是矩形了
只能横着切或者竖着切,而且一切的话要从头切到底(这很容易理解)
另外还有一个东西之前理解错了,就是一刀切下去会得到两个矩形,
选一个为本次切割得到的,以后只能切另一个,选出来的那个以后不能再切了
(如果是两者都能切,感觉复杂很多)
然后动态转移方程觉得还是比较容易想到的,大矩形dp值由小矩形dp值推得来
还要加上次数,dp[n][x1][y1][x2][y2]就是要令当前矩形分出n个小矩形,也就是切割n-1刀
我们要的目标值就是dp[n][1][1][8][8]
一:横着切,当前矩形将会分成上下两份
1.选上面:dp[k][x1][y1][x2][y2]=s[x1][y1][x][y2]+dp[k-1][x+1][y1][x2][y2];
2.选下面:dp[k][x1][y1][x2][y2]=s[x+1][y1][x2][y2]+dp[k-1][x1][y1][x][y2];
x1<=x<x2
二:竖着切,当前矩形将会分成左右两份
1.选左边:dp[k][x1][y1][x2][y2]=s[x1][y1][x2][y]+dp[k-1][x1][y+1][x2][y2];
2.选右边:dp[k][x1][y1][x2][y2]=s[x1][y+1][x2][y2]+dp[k-1][x1][y1][x2][y];
y1<=y<y2
当k=1时也就是不用再继续分割了,dp[1][x1][y1][x2][y2]=s[x1][y1][x2][y2];
显然这个DP用记忆化搜索来做更合适,递推的话感觉很难写
最后强调一个细节问题,dp数组全部初始化为-1,表示还没被计算,
然后 dp[1][x1][y1][x2][y2]=s[x1][y1][x2][y2] 这个也好理解,就是不用切的时候的dp值
最后,比如当前要求的是dp[k][x1][y1][x2][y2],一开始要赋初值为INF,再开始枚举切割方案
因为对于dp[k][x1][y1][x2][y2],要分出k块矩形,但是不一定能分得到,可能根本不够分
所以当前状态如果根本分不出k个小矩形的话,这个状态是一个不可能的状态,为INF
整个枚举过程中它的值也不会更新
*/
这个题解中有两个多余的判断可以去掉。。
//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,a[9][9],f[9][9][9][9][65],s[9][9][9][9],sum;
int dfs(int x1,int y1,int x2,int y2,int k){
if(~f[x1][y1][x2][y2][k])return f[x1][y1][x2][y2][k];
int temp=0x3fffffff;
for(int i=x1+1;i<=x2;i++){
temp=min(temp,dfs(i,y1,x2,y2,k-1)+s[x1][y1][i-1][y2]);
temp=min(temp,dfs(x1,y1,i-1,y2,k-1)+s[i][y1][x2][y2]);
}
for(int i=y1+1;i<=y2;i++){
temp=min(temp,dfs(x1,i,x2,y2,k-1)+s[x1][y1][x2][i-1]);
temp=min(temp,dfs(x1,y1,x2,i-1,k-1)+s[x1][i][x2][y2]);
}
return f[x1][y1][x2][y2][k]=temp;
}
int main(){
memset(f,-1,sizeof(f));
scanf("%d",&n);
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
scanf("%d",&a[i][j]),sum+=a[i][j];
for(int x1=1;x1<=8;x1++)
for(int y1=1;y1<=8;y1++)
for(int x2=x1;x2<=8;x2++)
for(int y2=y1;y2<=8;y2++){
int temp=0;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
temp+=a[i][j];
f[x1][y1][x2][y2][1]=s[x1][y1][x2][y2]=temp*temp;
}
double tmp=1.0*sum/n;
printf("%.3lf\n",sqrt(1.0*dfs(1,1,8,8,n)/n-tmp*tmp));
}
POJ 1191 记忆化搜索的更多相关文章
- poj 1088(记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 88560 Accepted: 33212 Description ...
- Test for Job (poj 3249 记忆化搜索)
Language: Default Test for Job Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9733 A ...
- 滑雪(POJ 1088 记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 88094 Accepted: 33034 Description ...
- POJ 2704 Pascal's Travels 【DFS记忆化搜索】
题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS Memory Limit: 65536K Tota ...
- POJ 1579 Function Run Fun 【记忆化搜索入门】
题目传送门:http://poj.org/problem?id=1579 Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Tota ...
- 专题1:记忆化搜索/DAG问题/基础动态规划
A OpenJ_Bailian 1088 滑雪 B OpenJ_Bailian 1579 Function Run Fun C HDU 1078 FatMouse and Chee ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- poj 1191 棋盘切割 (压缩dp+记忆化搜索)
一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...
- POJ 1088 滑雪(记忆化搜索)
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 92384 Accepted: 34948 Description ...
随机推荐
- 学习CV:《OpenCV 3计算机视觉Python语言实现第2版》中文PDF+英文PDF+代码
理解与计算机视觉相关的算法.模型以及OpenCV 3 API背后的基本概念,有助于开发现实世界中的各种应用程序(比如:安全和监视领域的工具). OpenCV 3是一种先进的计算机视觉库,可以用于各种图 ...
- [luogu] P1772 [ZJOI2006]物流运输(动态规划,最短路)
P1772 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线 ...
- Unity Microphone 无限时长录制
原创文章:转载请标明出处--博客园 Jason_c Unity可以很方便的通过 Microphone.Start()方法来调用麦克风,但是有一个弊端是,必须传入时长,这就很尴尬了,因为大多数时间,我们 ...
- hdoj-1212-Big Number【大数取余&简单题】
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- HTML5实战与剖析之媒体元素(3、媒体元素的事件及方法)
HTML5中的媒体元素除了拥有非常多的属性之外,video标签和audio标签还能够出发非常多事件和方法. 这些方法监控着不同的属性的变化,这些变化有可能是媒体播放的结果,也可能是用户操作媒体的结果. ...
- SVN过滤设置
为了方便管理我们的系统版本号.非常多人会用到SVN,开发中我们经经常使用到SVN插件, 可是对于某些文件的缓存来说, 我们仅仅要有操作缓存便会保存一次, 每次提交非常是麻烦, 可能有的文件或者目录我们 ...
- rest_framework_HyperlinkedIdentityField
#生成链接 HyperlinkedIdentityField class UserInfoSerializer(serializers.ModelSerializer): group = serial ...
- [BZOJ4289] [PA2012] Tax 解题报告 (最短路+差分建图)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 4289: PA2012 Tax Time Limit: 10 Sec Memo ...
- POJ 3173 模拟
按照题意模拟就好-- //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; in ...
- CUDA还未产出,又要出北洋多元统计习题集
其实目前是自己摸清了一个套路.genome realign的算法,以及CUDA的写法都已经有数了,前两天也弄完了关静的所有任务.但是今天关静早上一上来就宣布一个重磅消息:除了全学期的作业和期末论文,另 ...