1 条题解
-
0
自动搬运
来自洛谷,原作者为

niiick
**搬运于
2025-08-24 21:35:15,当前版本为作者最后更新于2018-09-25 12:26:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
楼上的记搜和我差不多,可惜没怎么解释,
以及楼上上竟然惊现七重循环???记忆化搜索
首先均方差(标准差)的公式为$σ=\sqrt{\sum_{i=1}^n\frac{(x_i-\overline{x})^2}{n}}$ (是第个矩阵的总分,为n个矩阵总分的平均数)
由于不变,我们实际要求的就是最小
表示将矩阵分割成个可以得到的最小值
那么有状态转移方程
(枚举竖着切,)
$DP[a,b,c,d,num]=Min_{k=1}^{num-1}(DP[a,b,c,i,k]+DP[a,i+1,c,d,num-k])$
(枚举横着切,)
$DP[a,b,c,d,num]=Min_{k=1}^{num-1}(DP[a,b,i,d,k]+DP[i+1,b,c,d,num-k])$
当时,返回
最后答案为
//niiick #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std; typedef long long lt; typedef double dd; #define sqr(x) ((x)*(x)) int read() { int x=0,f=1; char ss=getchar(); while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();} while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();} return x*f; } const int maxn=17; int n,m,k; int a[maxn][maxn],sum[maxn][maxn]; dd dp[maxn][maxn][maxn][maxn][maxn],ave; dd qsum(int a,int b,int c,int d){return (dd)(sum[c][d]-sum[a-1][d]-sum[c][b-1]+sum[a-1][b-1]);} dd DP(int a,int b,int c,int d,int num) { if(dp[a][b][c][d][num]) return dp[a][b][c][d][num]; else if(num==1) return sqr(qsum(a,b,c,d)-ave); dp[a][b][c][d][num]=1e9; for(int i=b;i<d;++i) for(int j=1;j<num;++j) { dd tt=DP(a,b,c,i,j)+DP(a,i+1,c,d,num-j); dp[a][b][c][d][num]=min(dp[a][b][c][d][num],tt); } for(int i=a;i<c;++i) for(int j=1;j<num;++j) { dd tt=DP(a,b,i,d,j)+DP(i+1,b,c,d,num-j); dp[a][b][c][d][num]=min(dp[a][b][c][d][num],tt); } return dp[a][b][c][d][num]; } int main() { n=read();m=read();k=read(); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) a[i][j]=sum[i][j]=read(), sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; ave=(dd)sum[n][m]/(dd)k; printf("%.2lf",sqrt(DP(1,1,n,m,k)/(dd)k)); return 0; }
- 1
信息
- ID
- 1216
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者