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 }
原文地址:https://www.cnblogs.com/huangriq/p/2447087.html