zoukankan      html  css  js  c++  java
  • 【记忆化搜索】bzoj1048 [HAOI2007]分割矩阵

    标准差=√(Σ(xi-xba)2/n)=Σ(xi)2+xba*n-2*xba*sum。只需最小化每个分割出来的矩阵的平方和即可。

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define INF 2000000000
    typedef double db;
    int mem[11][11][11][11][11],a[11][11],pre[11][11],m,n,K;
    int sum;
    db xba;
    int sqr(int x){return x*x;}
    int calc(int x1,int y1,int x2,int y2)
    {return pre[x2][y2]-pre[x1-1][y2]-pre[x2][y1-1]+pre[x1-1][y1-1];}
    int f(int x1,int y1,int x2,int y2,int K)
    {
    	if(mem[x1][y1][x2][y2][K]<INF) return mem[x1][y1][x2][y2][K];
    	if(K==1) return mem[x1][y1][x2][y2][K]=sqr(calc(x1,y1,x2,y2));
    	for(int i=x1;i<x2;++i)
    	  for(int j=1;j<K;++j)
    	    if((y2-y1+1)*(i-x1+1)>=j&&(y2-y1+1)*(x2-i)>=K-j)
    	      mem[x1][y1][x2][y2][K]=min(mem[x1][y1][x2][y2][K],f(x1,y1,i,y2,j)+f(i+1,y1,x2,y2,K-j));
    	for(int i=y1;i<y2;++i)
    	  for(int j=1;j<K;++j)
    	    if((x2-x1+1)*(i-y1+1)>=j&&(x2-x1+1)*(y2-i)>=K-j)
    	      mem[x1][y1][x2][y2][K]=min(mem[x1][y1][x2][y2][K],f(x1,y1,x2,i,j)+f(x1,i+1,x2,y2,K-j));
    	return mem[x1][y1][x2][y2][K];
    }
    int main()
    {
    	scanf("%d%d%d",&n,&m,&K);
    	for(int i=1;i<=n;++i)
    	  for(int j=1;j<=m;++j)
    	    {
    	      scanf("%d",&a[i][j]);
    	      sum+=a[i][j];
    	      pre[i][j]=pre[i][j-1]+a[i][j];
    	    }
    	xba=(db)sum/(db)K;
    	for(int j=1;j<=m;++j)
    	  for(int i=1;i<=n;++i)
    	    pre[i][j]+=pre[i-1][j];
    	memset(mem,0x7f,sizeof(mem));
    	printf("%.2f
    ",sqrt(((db)f(1,1,n,m,K)+(db)K*xba*xba-2.0*(db)sum*xba)/(db)K));
    	return 0;
    }
  • 相关阅读:
    Spring 配置数据源的几种方式
    Java List 数据操作
    javascript 数组方法解析
    jQuery 获取页面元素的属性值
    表格列排序
    优秀资源的收集
    Java 集合介绍
    二进制、八进制、十进制、十六进制的转换
    Nginx配置
    Nginx安装
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4371227.html
Copyright © 2011-2022 走看看