[HAOI2007] 分割矩阵
程序员文章站
2023-02-08 08:09:57
显然,最终的平均值不变。 这样,我们设f[w,a,b,c,d]为在矩形[a~c,b~d]中割了w刀的根号内分子和。 那么,状态转移有f[w,a,b,c,d] = min f[p,a,b,k,d]+f[w p 1,k+1,b,c,d] f[p,a,b,c,k]+f[w p 1,a,k+1,c,d] 初 ......
显然,最终的平均值不变。
这样,我们设f[w,a,b,c,d]为在矩形[a~c,b~d]中割了w刀的根号内分子和。
那么,状态转移有f[w,a,b,c,d] = min
f[p,a,b,k,d]+f[w-p-1,k+1,b,c,d]
f[p,a,b,c,k]+f[w-p-1,a,k+1,c,d]
初始化为 f[0,a,b,c,c,d]=sqr (sum[a~c,b~d] - ave)
阶段是割的次数。dp就好了。
答案最终除以t再开根号。
附录:
均方差,通常指标准差 ,表达式为
\[
\sqrt{\frac{\sum_{i=1}^n (x_i-\bar x)}{n}}
\]
#include <bits/stdc++.h> using namespace std; int n,m,t; double s[11][11],ave; double f[30][11][11][11][11]; double sum(int a,int b,int c,int d) { return s[c][d]-s[a-1][d]-s[c][b-1]+s[a-1][b-1]; } double sqr(double x) { return x*x; } void upmin(double&x,const double&y) { if(y<x) x=y; } int main() { scanf("%d%d%d",&n,&m,&t); for(int i=1; i<=n; ++i) { for(int j=1; j<=m; ++j) { scanf("%lf",&s[i][j]); ave+=s[i][j]; s[i][j]=s[i][j]+s[i-1][j]+s[i][j-1]-s[i-1][j-1]; } } ave/=t; memset(f,0x7f,sizeof f); for(int a=1; a<=n; ++a) { for(int b=1; b<=m; ++b) { for(int c=a; c<=n; ++c) { for(int d=b; d<=m; ++d) { f[0][a][b][c][d]=sqr(sum(a,b,c,d)-ave); } } } } for(int w=1; w<t; ++w) { for(int a=1; a<=n; ++a) { for(int b=1; b<=m; ++b) { for(int c=a; c<=n; ++c) { for(int d=b; d<=m; ++d) { for(int p=0; p<w; ++p) { for(int k=a; k<c; ++k) { upmin(f[w][a][b][c][d],f[p][a][b][k][d]+f[w-p-1][k+1][b][c][d]); } for(int k=b; k<d; ++k) { upmin(f[w][a][b][c][d],f[p][a][b][c][k]+f[w-p-1][a][k+1][c][d]); } } } } } } } //真是令人智熄 printf("%.2f\n",sqrt(f[t-1][1][1][n][m]/t)); return 0; }
下一篇: 世界第一高桥是哪个桥 世界第一高桥在哪里