poj 1191(棋盘分割)
View Code
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 double col[10][10],s[10][10][10][10],var[10][10][10][10][20]; 8 int main() 9 { 10 double n,a; 11 double sum=0; 12 memset(col,0,sizeof(col)); 13 memset(var,0,sizeof(var)); 14 scanf("%lf",&n); 15 for(int i=1;i<=8;i++) 16 for(int j=1;j<=8;j++) 17 { 18 scanf("%lf",&a); 19 col[i][j]=col[i-1][j]+a; 20 //cout<<a<<endl; 21 sum+=a; 22 } 23 double avg=sum/n; 24 //cout<<avg<<endl; 25 //for(int i=1;i<=8;i++,cout<<endl) 26 //for(int j=1;j<=8;j++) 27 //{ 28 // printf("%.0lf ",col[i][j]); 29 //} 30 for(int i=1;i<=8;i++) 31 for(int j=1;j<=8;j++) 32 for(int k=i;k<=8;k++) 33 for(int h=j;h<=8;h++) 34 { 35 if(h>1) 36 s[i][j][k][h]=s[i][j][k][h-1]+col[k][h]-col[i-1][h]; 37 else s[i][j][k][h]=col[k][h]-col[i-1][h]; 38 var[i][j][k][h][1]=((s[i][j][k][h]-avg)*(s[i][j][k][h]-avg))/n; 39 //printf("%.0lf ",s[i][j][k][h]); 40 } 41 //int x,y,z,p; 42 //while(cin>>x>>y>>z>>p) 43 //cout<<s[x][y][z][p]<<endl; 44 for(int k=2;k<=n;k++) 45 for(int i=1;i<=8;i++) 46 for(int j=1;j<=8;j++) 47 for(int f=i;f<=8;f++) 48 for(int h=j;h<=8;h++) 49 { 50 double mi=9999999999; 51 for(int i0=i;i0<f;i0++) 52 { 53 mi=min(var[i][j][i0][h][k-1]+var[i0+1][j][f][h][1],mi); 54 mi=min(var[i][j][i0][h][1]+var[i0+1][j][f][h][k-1],mi); 55 } 56 for(int j0=j;j0<h;j0++) 57 { 58 mi=min(var[i][j][f][j0][k-1]+var[i][j0+1][f][h][1],mi); 59 mi=min(var[i][j][f][j0][1]+var[i][j0+1][f][h][k-1],mi); 60 } 61 var[i][j][f][h][k]=mi; 62 } 63 printf("%.3lf\n",sqrt(var[1][1][8][8][(int)n])); 64 return 0; 65 }