初学DP(2) 黑书中的《棋盘分割》

题意:

将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)

原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。

均方差,其中平均值,xi为第i块矩形棋盘的总分。

请编程对给出的棋盘及n,求出O‘的最小值。

分析:

将公式化简可以得到σ2 =
1/n*∑xi2 - ˉx,也就是只需要使∑xi2最小即可;

我们用dp[a][i][j][k][s]表示第a次切割(i,j,k,s)棋盘的最小值;

则有

minmin=min(minmin,min(dp[a-1][i][j][m][s]+t*t,dp[a-1][m+1][j][k][s]+t2*t2));    (i<=m<k)

minmin=min(minmin,min(dp[a-1][i][j][k][m]+t*t,dp[a-1][i][m+1][k][s]+t2*t2));    (j<=m<s)

dp[a][i][j][k][s]=minmin;

poj1191 :http://poj.org/problem?id=1191

参考代码:

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
#define inf 0xffffff
int n,a[10][10],sum[10][10];
int dp[15][10][10][10][10];
int countsum(int x1,int y1,int x2,int y2){
	return sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];
}
int fun(int k){
	//初始化
	for (int i=0;i<8;i++)
		for (int j=0;j<8;j++)
			for (int k=0;k<8;k++)
				for (int s=0;s<8;s++){
					int t=countsum(i,j,k,s);
					dp[0][i][j][k][s]=t*t;
				}
	for (int a=1;a<=k;a++){
		for (int i=0;i<8;i++){
			for (int j=0;j<8;j++){
				for (int k=0;k<8;k++){
					for (int s=0;s<8;s++){
						int minmin = inf;
						if ((k-i+1)*(s-j+1)<a+1){
							dp[a][i][j][k][s]=minmin;
							continue;
						}
						for (int m=i;m<k;m++){
							int t=countsum(m+1,j,k,s);
							int t2=countsum(i,j,m,s);
							minmin=min(minmin,min(dp[a-1][i][j][m][s]+t*t,dp[a-1][m+1][j][k][s]+t2*t2));
						}
						for (int m=j;m<s;m++){
							int t=countsum(i,m+1,k,s);
							int t2=countsum(i,j,k,m);
							minmin=min(minmin,min(dp[a-1][i][j][k][m]+t*t,dp[a-1][i][m+1][k][s]+t2*t2));
						}
						dp[a][i][j][k][s]=minmin;
					}
				}
			}
		}
	}
	return dp[k][0][0][7][7];
}
int main(){
	while (cin>>n){
		for (int i=0;i<8;i++){
			int s=0;
			for (int j=0;j<8;j++){
				cin>>a[i][j];
				s+=a[i][j];
				if (i==0)
					sum[i][j]=s;
				else
					sum[i][j]=sum[i-1][j]+s;
			}
		}
		double ans = n*fun(n-1)-sum[7][7]*sum[7][7];
		cout<<fixed<<setprecision(3)<<sqrt(ans/(n*n))<<endl;
	}
	return 0;
}

用C++提交答案是WA 用G++就AC了。。。

时间: 2024-10-06 23:07:48

初学DP(2) 黑书中的《棋盘分割》的相关文章

初学DP(1) 黑书中的《括号序列》

题目:括号序列 定义如下规则序列(字符串): 1.空序列是规则序列: 2.如果S是规则序列,那么(S)和[S]也是规则序列: 3.如果A和B都是规则序列,那么AB也是规则序列: 例如,下面的字符串都是规则序列: (),    [],    (()),    ([]),    ()[()]; 而这几个就不是规则序列: (,    [,    )(,    ([]; 现在给出一些有'(',')','[',']'构成的序列,请添加少量的括号,得到一个规则的序列. 分析: 用s[i],s[j]表示字符串

黑书例题 Fight Club 区间DP

题目可以在bnuoj.soj等OJ上找到. 题意: 不超过40个人站成一圈,只能和两边的人对战.给出任意两人对战的输赢,对于每一个人,输出是否可能是最后的胜者. 分析: 首先序列扩展成2倍,破环成链. dp[i][j]表示i和j能够相遇对打,那么dp[i][i+n]为真代表可以成为最后胜者. 枚举中间的k,若i和j都能和k相遇,且i和j至少一人能打赢k,那么i和j可以相遇. 复杂度o(n^3) 1 #include<cstdio> 2 #include<cstring> 3 usi

黑书练习题 更新中

1.4.7 奇数偶数 POJ 1733 Parity game 2.5.26 Unix 插头 POJ 1087 A Plug for UNIX 黑书练习题 更新中

POJ 1191 棋盘分割(DP)

题目链接 题意 : 中文题不详述. 思路 : 黑书上116页讲的很详细.不过你需要在之前预处理一下面积,那样的话之后列式子比较方便一些. 先把均方差那个公式变形, 另X表示x的平均值,两边平方得 平均值是一定的,所以只要让每个矩形的总分的平方和尽量小即可.左上角坐标为(x1,y1)右下角坐标为(x2,y2)的棋盘,设总和为s[][][][],切割k次以后得到k+1块矩形的总分平方和是d[k][][][][],则可以沿着横线切也可以沿着竖线切,然后选一块接着切,递归下去,状态转移方程 d[k,x1

【POJ 1191】 棋盘分割(DP)

[POJ 1191] 棋盘分割(DP) Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 13811   Accepted: 4917 Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分

黑书贪心例题之钓鱼 poj1042:Gone Fishing

总时间限制: 2000ms 内存限制: 65536kB 描述 John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachable along a single, one-way road. John starts at lake 1, but he can finish at a

数位dp(求1-n中数字1出现的个数)

题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不可以随意取,true为没降,true为已降):常规的记忆化搜索 代码: /****************************************************** * author:xiefubao *******************************************************/ #p

《九败一胜:美团创始人王兴创业十年》可以通过此书了解王兴和美团的一些事实。书中的概括评论部分我认为可以忽略 三星推荐

作者专门给企业和企业家写传,书中的内容还需要读者过滤.作者试图总结王兴的成功经验和王兴的优点,个人感觉这不是这本书最重要的,也不是作者擅长的.我最感兴趣的还是王兴和美团的历史和经验. 王兴在十年前创业初期做过十多个小项目,都是自己想出来的,都没做下去.后来做的主要是从美国复制:校内copy facebook(甚至copy了页面风格),饭否复制twitter,美团复制groupon.个人看法王兴最大的优势是多次的失败经验. 后面一半讲美团的发展历程.作者还跟着一些销售去签单子体验美团的流程.我本来

[ACM] hdu 3555 Bomb (数位DP,统计1-N中含有“49”的总数)

Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 7187 Accepted Submission(s): 2512 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists impro