您的位置:首页 > 其它

棋盘分割[NOI 1999][Codevs 1711]

2016-06-25 16:46 337 查看

题目描述 Description

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

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

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

输入描述 Input Description

第 1 行为一个整数 n(1<n<15) 。

第 2 行至第 9 行每行为 8 个小于 100 的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。

输出描述 Output Description

仅一个数,为方差(四舍五入精确到小数点后三位)

样例输入 Sample Input

3

1 1 1 1 1 1 1 3

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1

1 1 1 1 1 1 1 0

1 1 1 1 1 1 0 3

样例输出 Sample Output

1.633

数据范围及提示 Data Size & Hint

若 x1,x2,x3......xn 的平均数为 m

则方差 s2=1/n[(x1−m)2+(x2−m)2+.......+(xn−m)2]

方差即偏离平方的均值,称为标准差或均方差,方差描述波动程度。

分析 I Think

s2=1n∑i=1n(xi−x¯)2=1n∑i=1n(x2i−2∗xi∗x¯+x¯)2=1n∑i=1nx2i−x¯∗∑i=1nxi+x¯2=1n∑i=1nx2i−x¯2

因为 x¯ 是一个定值。,所以我们只要求出 ∑ni=1x2i 的最小值即可。可以用记忆化搜索来完成

代码 Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;

int f[20][10][10][10][10];
int s[10][10][10][10];
int n;
int w[10][10];

int dfs(int,int,int,int,int);

int main(){

scanf("%d",&n);
for(int i=1;i<=8;++i)
for(int j=1;j<=8;++j){
scanf("%d",&w[i][j]);
s[i][j][i][j] = w[i][j];
}

for(int a=1;a<=8;++a)
for(int b=1;b<=8;++b)
for(int c=a;c<=8;++c)
for(int d=b;d<=8;++d){
for(int e=a;e<=c;++e)
for(int f=b;f<=d;++f)
s[a][b][c][d] += w[e][f];
f[0][a][b][c][d] = s[a][b][c][d]*s[a][b][c][d];
}

printf("%.3lf",sqrt((double)(dfs(1,1,1,8,8)-(double)(s[1][1][8][8]*s[1][1][8][8])/(double)n)/(double)n));

return 0;

}

int dfs(int x,int a,int b,int c,int d){

if(x == n)
return f[0][a][b][c][d];
if(f[x][a][b][c][d])
return f[x][a][b][c][d];

int ans = 0x3f3f3f3f;

for(int i=a+1;i<=c;++i)
ans = min(ans,min(f[0][a][b][i-1][d]+dfs(x+1,i,b,c,d),f[0][i][b][c][d]+dfs(x+1,a,b,i-1,d)));

for(int i=b+1;i<=d;++i)
ans = min(ans,min(f[0][a][b][c][i-1]+dfs(x+1,a,i,c,d),f[0][a][i][c][d]+dfs(x+1,a,b,c,i-1)));

return f[x][a][b][c][d] = ans;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: