乱搜
/************************************************************** Problem: 1048 User: lxy8584099 Language: C++ Result: Accepted Time:228 ms Memory:6768 kb ****************************************************************/ /* 暴搜++ */ #include<cstdio> #include<cmath> #include<algorithm> #define pow(x) ((x)*(x)) using namespace std; const int N=15; int n,m,r,a[N][N],s[N][N]; double p,f[N][N][N][N][N]; double find(int a,int b,int c,int d) // 提取矩阵大小 { return (double)(s[c][d]-s[a-1][d]-s[c][b-1]+s[a-1][b-1]); } void dfs(int a,int b,int c,int d,int n) { if(f[a][b][c][d][n]) return; else if(n==1) { f[a][b][c][d][n]=pow(find(a,b,c,d)-p); return ; } f[a][b][c][d][n]=1e9; for(int i=a;i<c;i++) // 横着切 for(int j=1;j<n;j++) { dfs(a,b,i,d,j);dfs(i+1,b,c,d,n-j); dfs(a,b,i,d,n-j);dfs(i+1,b,c,d,j); double r1=f[a][b][i][d][j]+f[i+1][b][c][d][n-j]; double r2=f[a][b][i][d][n-j]+f[i+1][b][c][d][j]; f[a][b][c][d][n]=min(f[a][b][c][d][n],min(r1,r2)); } for(int i=b;i<d;i++) // 竖着切 for(int j=1;j<n;j++) { dfs(a,b,c,i,j);dfs(a,i+1,c,d,n-j); dfs(a,b,c,i,n-j);dfs(a,i+1,c,d,j); double r1=f[a][b][c][i][j]+f[a][i+1][c][d][n-j]; double r2=f[a][b][c][i][n-j]+f[a][i+1][c][d][j]; f[a][b][c][d][n]=min(f[a][b][c][d][n],min(r1,r2)); } } int main() { scanf("%d%d%d",&n,&m,&r); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j]-s[i-1][j-1]; } p=s[n][m]*1.0/r; // printf("p: %lf\n",p); dfs(1,1,n,m,r); printf("%.2lf\n",sqrt(f[1][1][n][m][r]/r)); return 0; }