您的位置:首页 > 其它

poj 1191(棋盘分割)

2012-04-14 15:15 323 查看
View Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
double col[10][10],s[10][10][10][10],var[10][10][10][10][20];
int main()
{
double n,a;
double sum=0;
memset(col,0,sizeof(col));
memset(var,0,sizeof(var));
scanf("%lf",&n);
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
{
scanf("%lf",&a);
col[i][j]=col[i-1][j]+a;
//cout<<a<<endl;
sum+=a;
}
double avg=sum/n;
//cout<<avg<<endl;
//for(int i=1;i<=8;i++,cout<<endl)
//for(int j=1;j<=8;j++)
//{
// printf("%.0lf ",col[i][j]);
//}
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
for(int k=i;k<=8;k++)
for(int h=j;h<=8;h++)
{
if(h>1)
s[i][j][k][h]=s[i][j][k][h-1]+col[k][h]-col[i-1][h];
else s[i][j][k][h]=col[k][h]-col[i-1][h];
var[i][j][k][h][1]=((s[i][j][k][h]-avg)*(s[i][j][k][h]-avg))/n;
//printf("%.0lf ",s[i][j][k][h]);
}
//int x,y,z,p;
//while(cin>>x>>y>>z>>p)
//cout<<s[x][y][z][p]<<endl;
for(int k=2;k<=n;k++)
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
for(int f=i;f<=8;f++)
for(int h=j;h<=8;h++)
{
double mi=9999999999;
for(int i0=i;i0<f;i0++)
{
mi=min(var[i][j][i0][h][k-1]+var[i0+1][j][f][h][1],mi);
mi=min(var[i][j][i0][h][1]+var[i0+1][j][f][h][k-1],mi);
}
for(int j0=j;j0<h;j0++)
{
mi=min(var[i][j][f][j0][k-1]+var[i][j0+1][f][h][1],mi);
mi=min(var[i][j][f][j0][1]+var[i][j0+1][f][h][k-1],mi);
}
var[i][j][f][h][k]=mi;
}
printf("%.3lf\n",sqrt(var[1][1][8][8][(int)n]));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: