1191 棋盘分割

原创 2011年01月24日 12:50:00

http://poj.org/problem?id=1191

 

 

刘汝佳黑书上有证明,先化简了求解公式,最后直接关联到xi2(i=1,2,3…,n)。

看了好久,起初被五维数组吓到了。

后来想了一下,记录主要是为了避免TLE而已。

递归的思想,n==2的情况来想,就容易很多了^ ^

附上书上的截图

//pku poj 1191 棋盘分割

#include<iostream>

#include<math.h>

double d[10][10][10][10][20]; //记录状态

double     s[10][10][10][10]; //记录每一块的和

double map[10][10];

double MY_min(double a,double b)  //比较函数

{

      return a<b ? a : b ;

}

double sum_area(int i1,int j1,int i2,int j2) //计算每一块的和

{

      if(s[i1][j1][i2][j2]>=0)      //这一步避免重复计算

            return s[i1][j1][i2][j2];

      int i,j;

      double sum=0;

      for(i=i1;i<=i2;i++)

      {

           for(j=j1;j<=j2;j++)

           {

                 sum+=map[i][j];

           }

      }

      s[i1][j1][i2][j2]=sum*sum; //预先平方

      return s[i1][j1][i2][j2];

}

double calculate(int i1,int j1,int i2,int j2,int n)

{

      if(d[i1][j1][i2][j2][n]>=0)

           return d[i1][j1][i2][j2][n];

      if(n==1)

           return s[i1][j1][i2][j2];

      double mini=99999999999;

      double temp_min;

      int i,j;

 

      //下面这两个循环判断横切还是竖切

      for(i=i1;i<i2;i++) //判断横切是取上半部分还是下半部分

      {

           temp_min=MY_min( calculate(i1,j1,i,j2,n-1)+sum_area(i+1,j1,i2,j2) ,  calculate(i+1,j1,i2,j2,n-1)+sum_area(i1,j1,i,j2)  );

           if(temp_min<mini)

                 mini=temp_min;

      }

      for(j=j1;j<j2;j++) //判断竖切是取左半部分还是右半部分

      {

           temp_min=MY_min( calculate(i1,j1,i2,j,n-1)+sum_area(i1,j+1,i2,j2) ,  calculate(i1,j+1,i2,j2,n-1)+sum_area(i1,j1,i2,j)  );

           if(temp_min<mini)

                 mini=temp_min;

      }

      d[i1][j1][i2][j2][n]=mini;//保存状态

      return d[i1][j1][i2][j2][n];

}

int main()

{

      int n;

      int i,j;

      double sum=0;

      double mini;

      scanf("%d",&n);

      for(i=1;i<=8;i++)

      {

           for(j=1;j<=8;j++)

           {

                 scanf("%lf",&map[i][j]);

                 sum+=map[i][j];

           }

      }

 

      //两个数组都先初始化为-1,方便之后每一次判断避免重复运算

      memset(d,-1,sizeof(d));

      memset(s,-1,sizeof(s));

 

      mini=calculate(1,1,8,8,n);

     

      sum/=(n*1.0);

      printf("%.3lf/n",sqrt(mini/(n*1.00)-(sum*sum)));

      return 0;

}

 

pku1191 棋盘分割 DP

简单的枚举切法然后记忆化更新 时间复杂度嗯……n^m?其实要小的多,然而好像只能这样写 Problem: 1191 User: BPM136 Memory: 1500K Time: 16MS ...
  • BPM136
  • BPM136
  • 2016年03月16日 16:27
  • 211

【poj 1191】棋盘分割 题解&代码(C++)

poj dp
  • DERITt
  • DERITt
  • 2016年04月12日 07:54
  • 540

poj 1191 棋盘分割

一道简单易错的动态规划问题 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:...
  • yskyskyer123
  • yskyskyer123
  • 2016年01月30日 22:44
  • 180

POJ 1191棋盘分割

 棋盘分割Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 5827 Accepted: 2092>>Description将一个8*...
  • bobten2008
  • bobten2008
  • 2009年10月08日 15:19
  • 1916

poj 1191棋盘分割

题目地址:http://poj.org/problem?id=1191 要求最小的方差,先用平方差公式:σ ^2 = ∑(xi)^ -n*x .  x为平均值.这样,求最小的平分和就行了. ...
  • yunfanfighting
  • yunfanfighting
  • 2012年07月07日 16:32
  • 361

poj 1191 棋盘分割

题目意思,中文不解释: —————————————— 分割线 —————————————— 根据题目的公式可得到,很多东东。 σ=sqrt(((x1-x)^2+(x2-x)^2+.....
  • u011403366
  • u011403366
  • 2014年03月08日 15:52
  • 421

POJ 1191 棋盘分割

??????:????????????:?????????sigma(xi^2)?????dp[x1][y1][x2][y2][k]???(x1,y1)?(x2,y2 )??????k????????...
  • HYB733093411
  • HYB733093411
  • 2016年08月02日 00:01
  • 84

POJ 1191 棋盘分割

刷了这么长时间POJ了   可算看到了一个中文题,不容易啊~~。 题目大意:自己看。 解题思路: dp[x1][y1][x2][y2][num]代表从(x1,y1)到(x...
  • lin375691011
  • lin375691011
  • 2014年05月21日 21:08
  • 3923

1191 棋盘分割

#include #include #define INF 10000000 using   namespace std;const   int m =   8 ;int a[ 10 ][ 10 ...
  • hqd_acm
  • hqd_acm
  • 2010年05月26日 23:50
  • 570

Poj 1191 棋盘分割

题目大意:将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着...
  • Detective_Xin
  • Detective_Xin
  • 2012年01月22日 13:49
  • 431
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:1191 棋盘分割
举报原因:
原因补充:

(最多只允许输入30个字)