正题
题目链接:https://www.luogu.org/problem/P2217
题目大意
a∗ba*ba∗b的矩阵,分成nnn个矩阵,求每个矩阵均方差最小,求答案。
解题思路
切n−1n-1n−1刀
设fk,x1,y1,x2,y2f_{k,x1,y1,x2,y2}fk,x1,y1,x2,y2表示矩阵(x1,y1,x2,y2)(x1,y1,x2,y2)(x1,y1,x2,y2)还剩下kkk刀时的最小均方差,dfsdfsdfs转移即可。
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a,b,n;
double x[12][12],f[12][12][12][12][12],ave;
bool v[12][12][12][12][12];
double dfs(int dep,int x1,int y1,int x2,int y2)
{if(v[dep][x1][y1][x2][y2])return f[dep][x1][y1][x2][y2];if(!dep){double ans=0;for(int i=x1;i<=x2;i++)for(int j=y1;j<=y2;j++)ans+=x[i][j];v[dep][x1][y1][x2][y2]=1;return (f[dep][x1][y1][x2][y2]=((ans-ave)*(ans-ave)));}double mins=1e9;for(int i=0;i<dep;i++){for(int j=x1;j<x2;j++)mins=min(mins,dfs(i,x1,y1,j,y2)+dfs(dep-i-1,j+1,y1,x2,y2));for(int j=y1;j<y2;j++)mins=min(mins,dfs(i,x1,y1,x2,j)+dfs(dep-i-1,x1,j+1,x2,y2));}v[dep][x1][y1][x2][y2]=1;f[dep][x1][y1][x2][y2]=mins;if(mins==0) printf("%d %d %d %d %d\n",dep,x1,y1,x2,y2);return mins;
}
int main()
{scanf("%d%d%d",&a,&b,&n);for(int i=1;i<=a;i++)for(int j=1;j<=b;j++)scanf("%lf",&x[i][j]),ave+=x[i][j];ave/=(double)n;dfs(n-1,1,1,a,b);printf("%.2lf",sqrt(f[n-1][1][1][a][b]/(double)n));
}