1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+ (x<<3)+(ch^48);ch=getchar();}return x*f;}
#define N 10 int n, m, i, j, k; int f[N][N][N][N][16]; int s[N][N], a[N][N], sigam[N][N][N][N]; double he;
int sum(int lx, int ly, int rx, int ry) { if(sigam[lx][ly][rx][ry]!=-1) return sigam[lx][ly][rx][ry]; int Sum=s[rx][ry]-s[lx-1][ry]-s[rx][ly-1]+s[lx-1][ly-1]; return sigam[lx][ly][rx][ry]=Sum*Sum; }
int dfs(int lx, int ly, int rx, int ry, int k) { if(f[lx][ly][rx][ry][k]!=-1) return f[lx][ly][rx][ry][k]; if(k==1) return f[lx][ly][rx][ry][k]=sum(lx, ly, rx, ry); int ans=999999999999; for(int i=lx; i<rx; ++i) { ans=min(ans, dfs(lx, ly, i, ry, k-1)+sum(i+1, ly, rx, ry)); ans=min(ans, sum(lx, ly, i, ry)+dfs(i+1, ly, rx, ry, k-1)); } for(int i=ly; i<ry; ++i) { ans=min(ans, dfs(lx, ly, rx, i, k-1)+sum(lx, i+1, rx, ry)); ans=min(ans, sum(lx, ly, rx, i)+dfs(lx, i+1, rx, ry, k-1)); } return f[lx][ly][rx][ry][k]=ans; }
signed main() {
while(scanf("%lld", &k)!=EOF) { memset(f, -1, sizeof(f)); memset(sigam, -1, sizeof(sigam)); memset(s, 0, sizeof(s)); n=8; for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) a[i][j]=read(); for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j]; he=double(double(s[n][n])/double(k)); printf("%.3f\n", sqrt(double(dfs(1, 1, n, n, k))/double(k)-he*he)); } return 0; }
|