Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1184 Solved: 863
[Submit][Status][Discuss]
Description
将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此
分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了n个矩阵。(每次分割都只能
沿着数字间的缝隙进行)原矩阵中每一位置上有一个分值,一个矩阵的总分为其所含各位置上分值之和。现在需要
把矩阵按上述规则分割成n个矩阵,并使各矩阵总分的均方差最小。请编程对给出的矩阵及n,求出均方差的最小值
。
Input
第一行为3个整数,表示a,b,n(1<a,b<=10,1<n<=10)的值。
第二行至第n+1行每行为b个小于100的非负整数,表示矩阵中相应位置上的分值。每行相邻两数之间用一个空
格分开。
Output
仅一个数,为均方差的最小值(四舍五入精确到小数点后2位)
Sample Input
5 4 4
2 3 4 6
5 7 5 1
10 4 0 5
2 0 2 3
4 1 1 1
Sample Output
0.50
二维前缀和+dfs搜索,数据量较小所以能过
均方差指的就是标准差,求方差有两个公式,我这里用的是另一种
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 7 const int INF=1e9; 8 9 int a,b,n; 10 int A[15][15],s[15][15]; 11 int f[15][15][15][15][15]; 12 double ave,ans; 13 14 int dfs(int x1,int y1,int x2,int y2,int k) 15 { 16 int &res=f[x1][y1][x2][y2][k]; 17 if(res!=-1) return res; 18 if(k==1) 19 { 20 res=s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]; 21 res=res*res; 22 return res; 23 } 24 res=INF; 25 for(int i=x1+1;i<=x2;i++) 26 for(int j=1;j<k;j++) 27 res=min(res,dfs(x1,y1,i-1,y2,j)+dfs(i,y1,x2,y2,k-j)); 28 for(int i=y1+1;i<=y2;i++) 29 for(int j=1;j<k;j++) 30 res=min(res,dfs(x1,y1,x2,i-1,j)+dfs(x1,i,x2,y2,k-j)); 31 return res; 32 } 33 34 int main() 35 { 36 memset(f,-1,sizeof(f)); 37 scanf("%d %d %d",&a,&b,&n); 38 for(int i=1;i<=a;i++) 39 for(int j=1;j<=b;j++) 40 scanf("%d",&A[i][j]); 41 for(int i=1;i<=a;i++) 42 for(int j=1;j<=b;j++) 43 s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+A[i][j]; 44 ave=(double)s[a][b]/n; 45 ans=dfs(1,1,a,b,n); 46 printf("%.2lf",sqrt((ans-n*ave*ave)/n)); 47 return 0; 48 }
原文地址:https://www.cnblogs.com/InWILL/p/9464230.html
时间: 2024-10-10 18:01:07