题目:http://poj.org/problem?id=1191
注:黑书P166
源代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define INF 1e7
using namespace std;
int map[10][10],n;
double sum,arv,d[20][10][10][10][10],s[10][10][10][10];
double tmp1,tmp2,ans;
int main()
{
//freopen("F:\\a.txt","r",stdin);
scanf("%d",&n);
sum=0;
for(int i=1;i<=8;i++)
for(int j=1;j<=8;j++)
{
scanf("%d",&map[i][j]);
sum+=map[i][j];
}
arv=sum/n;
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++)
{
sum=0;
for(int i=x1;i<=x2;i++)
for(int j=y1;j<=y2;j++)
sum+=map[i][j];
s[x1][y1][x2][y2]=sum*sum;
}
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++)
d[0][x1][y1][x2][y2]=s[x1][y1][x2][y2];
for(int k=1;k<n;k++)
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++)
{
d[k][x1][y1][x2][y2]=INF;
for(int a=x1;a<x2;a++)
{
tmp1=min(d[k-1][x1][y1][a][y2]+s[a+1][y1][x2][y2],d[k-1][a+1][y1][x2][y2]+s[x1][y1][a][y2]);
d[k][x1][y1][x2][y2]=min(d[k][x1][y1][x2][y2],tmp1);
}
for(int b=y1;b<y2;b++)
{
tmp2=min(d[k-1][x1][y1][x2][b]+s[x1][b+1][x2][y2],d[k-1][x1][b+1][x2][y2]+s[x1][y1][x2][b]);
d[k][x1][y1][x2][y2]=min(d[k][x1][y1][x2][y2],tmp2);
}
}
ans=d[n-1][1][1][8][8]/n-arv*arv;
printf("%.3f\n",sqrt(ans));
return 0;
}