zoukankan      html  css  js  c++  java
  • 1048: [HAOI2007]分割矩阵

    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 }
  • 相关阅读:
    随笔
    std::condition_variable(复习)
    随笔
    std::vector<std::vector<> >
    staitc_cast,const_cast....
    复制构造函数
    c++ 临时对象
    复制初始化和直接初始化
    随笔
    Fedora 安装oracle11g 之最简洁方式
  • 原文地址:https://www.cnblogs.com/InWILL/p/9464230.html
Copyright © 2011-2022 走看看