记录编号 | 191378 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [NOI 1999]棋盘分割 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.008 s | ||
提交时间 | 2015-10-07 15:48:09 | 内存使用 | 0.69 MiB | ||
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=16; const int inf=0x3f3f3f3f; int n; int map[9][9]; int f[9][9][9][9][maxn]; int main() { freopen("division.in","r",stdin); freopen("division.out","w",stdout); scanf("%d",&n); for(int i=1;i<=8;i++) for(int j=1;j<=8;j++) { scanf("%d",&map[i][j]); map[i][j]+=map[i-1][j]+map[i][j-1]-map[i-1][j-1]; } memset(f,inf,sizeof(f)); for(int i=1;i<=8;i++) for(int j=i;j<=8;j++) for(int p=1;p<=8;p++) for(int q=p;q<=8;q++) { f[i][j][p][q][0]=map[j][q]-map[i-1][q]-map[j][p-1]+map[i-1][p-1]; f[i][j][p][q][0]*=f[i][j][p][q][0]; } for(int k=1;k<n;k++) for(int i=1;i<=8;i++) for(int j=i;j<=8;j++) for(int p=1;p<=8;p++) for(int q=p;q<=8;q++) { for(int x=i;x<j;x++) { for(int t=0;t<k;t++) { int tmp; tmp=f[i][x][p][q][t]+f[x+1][j][p][q][k-1-t]; f[i][j][p][q][k]=min(f[i][j][p][q][k],tmp); } } for(int y=i;y<q;y++) { for(int t=0;t<k;t++) { int tmp; tmp=f[i][j][p][y][t]+f[i][j][y+1][q][k-1-t]; f[i][j][p][q][k]=min(f[i][j][p][q][k],tmp); } } } double cp=(double)(f[1][8][1][8][n-1]-(double)map[8][8]/n*map[8][8]); cp/=(double)n; cp=sqrt(cp); printf("%.3lf",cp+1e-8); return 0; }