把方差公式先变形为 σ2 = (1/n)∑xi2-xa2

xa为平均值。

由于要求标准差最小,只需方差最小,平均值都是一样的,n也是一样的,这样原问题就变为求这n快小棋盘总分的平方和最小

考虑左上角为(x1,y1),右上角为(x2,y2)的棋盘,设该棋盘切割K次后得到的K+1块矩形的总分平方和最小值为d[k,x1,y1,x2,y2]。该棋盘的总分平方和为

s[x1,y1,x2,y2].则它可以沿着横线切,也可以沿着竖线切,然后选一块继续切(这里可以用递归完成)

状态转移方程为d[k,x1,y1,x2,y2] =  min{

min{ d[k-1,x1,y1,a,y2] + s[a+1,y1,x2,y2] , d[k-1,a+1,y1,x2,y2] + s[x1,y1,a,y2] },    (x1 <= a < x2)

min{ d[k-1,x1,y1,x2,b] + s[x1,b+1,x2,y2] , d[k-1,x1,b+1,x2,y2] + s[x1,y1,x2,b] }  (y1 <= b < y2)

}

贴代码:

View Code

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #define N 9
 5 #define min(a,b) a<b?a:b
 6 #define INF 100000000
 7 int n;
 8 int map[N][N];
 9 int presum[N][N];
10 int d[16][N][N][N][N];//用d[k][x1][y1][x2][y2]表示左上角为(x1,y1)
11 //右下角为(x2,y2)的棋盘切成了k+1块时最小的总分平方和值
12 void presolve()
13 {
14     //预处理,算出所有左上角为(1,1)的所有矩阵元素和
15     int i,j;
16     for(i=0; i<=N; ++i)
17         presum[0][i] = 0,presum[i][0] = 0;
18     for(i=1; i<N; ++i)
19     {
20         int rowsum = 0;
21         for(j=1; j<N; ++j)
22         {
23             scanf("%d",&map[i][j]);
24             rowsum += map[i][j];
25             presum[i][j] = presum[i-1][j] + rowsum;
26         }
27     }
28 }
29 int rectSquare(int x1,int y1,int x2,int y2)
30 {
31     //计算左上角为(x1,y1),右下角为(x2,y2)的棋盘的总分平方和
32     int ret = presum[x2][y2] -presum[x1-1][y2] -presum[x2][y1-1] +presum[x1-1][y1-1];
33     return ret*ret;
34 }
35 //DP程序
36 int DP(int k,int x1,int y1,int x2,int y2)
37 {
38     int t,c,e;
39     int MIN = INF;//用来求最后的d[k][x1][y1][x2][y2]
40     if(d[k][x1][y1][x2][y2] != -1)//记忆化搜索???已经求过了,不再求,直接用
41         return d[k][x1][y1][x2][y2];
42     if(k == 0)//切0刀,不就是该棋盘了吗?最小值也是该棋盘的总分平方和,边界条件
43         return d[k][x1][y1][x2][y2]=rectSquare(x1,y1,x2,y2);
44     for(int a = x1; a < x2; ++a)
45     {
46         //横着切成了两块
47         c = rectSquare(a+1,y1,x2,y2);
48         e = rectSquare(x1,y1,a,y2);
49         t = min(DP(k-1,x1,y1,a,y2) + c,DP(k-1,a+1,y1,x2,y2) + e);//选取一块继续切割
50         MIN = min(MIN,t);
51     }
52     for(int b = y1; b < y2; ++b)
53     {
54         //竖着切成了两块
55         c = rectSquare(x1,b+1,x2,y2);
56         e = rectSquare(x1,y1,x2,b);
57         t= min(DP(k-1,x1,y1,x2,b)+c,DP(k-1,x1,b+1,x2,y2)+e);//选取一块继续切割
58         MIN = min(MIN,t);
59     }
60     d[k][x1][y1][x2][y2] = MIN;//所有的情况都考虑完后,所得就是该最小值
61 //    printf("d[%d][%d][%d][%d][%d] = %d\n",k,x1,y1,x2,y2,d[k][x1][y1][x2][y2]);
62     return MIN;
63 }
64 int main()
65 {
66 //    freopen("in.cpp","r",stdin);
67     scanf("%d",&n);
68     presolve();
69     memset(d,-1,sizeof(d));
70     int sumsquare = DP(n-1,1,1,8,8);
71     double f = n*sumsquare - presum[8][8]*presum[8][8];
72     f = sqrt(f)/n;
73     printf("%.3f\n",f);
74 //    printf("%d\n",0x7fffffff);
75     return 0;
76 }

注意:用double,然后用%.3lf WA
用%.3fAC
在DP时min的初始值赋为10^7WA
赋为10^8AC
这点我还比较想得通,棋盘最大的总分和为6400,最大的平方和即为6400^6400,为40960000
你赋的min值至少应该大于这个数,否则就不对了,所以10^7可能会错
我中间赋过一个0x7fffffff,竟然导致出现了负数,怎么会啊。。。。。不了解补充:我现在理解了为什么出现负数,因为0x7fffffff是最大的整数数了,再加就溢出了,成为负的了·····

转载于:https://www.cnblogs.com/allh123/archive/2013/05/05/3061122.html

棋盘切割 DP POJ 1191相关推荐

  1. POJ 1191 棋盘分割(区间DP)题解

    题意:中文题面 思路:不知道直接暴力枚举所有情况行不行... 我们可以把答案转化为 所以答案就是求xi2的最小值,那么我们可以直接用区间DP来写.设dp[x1][y1][x2][y2][k]为x1 y ...

  2. poj 1191 棋盘分割(记忆化dp+递归)

    根据这2个公式可以 得到 O^2 = sum(x1^2 + x2^2 + x3^2 +...xi^2)/n - 平均值^2 所以我们就是要使得总分的平方和尽量小-- 对于一次切割,可以横着切,可以竖着 ...

  3. pku 1191 棋盘分割 DP / 记忆化搜索

    http://poj.org/problem?id=1191 题意:中文省略. 思路:黑说p116有讲解, 主要的状态转移方程为 横着切: dp[k][x1][y1][x2][y2]  = min(d ...

  4. HDU-2067-小兔的棋盘(dp)

    小兔的棋盘 Problem Description 小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望.不过没过几天发现了棋盘的好玩之处.从起点(0 ...

  5. BZOJ 4813: [Cqoi2017]小Q的棋盘 (树形dp)

    题目传送门 Solution 树形背包dp大水题,是POJ某道题的弱化版...不想说了,据说贪心也能过此题.. 一开始50分,dp数组初始化炸了,表示无语.. Code #include <io ...

  6. 小L的项链切割(dp)

    题解: dp[i]表示前i+1个字符切割需要的最少次数      for(int i=0;i<l;i++)         {             dp[i]=huiwen(s.substr ...

  7. P1169 [ZJOI2007]棋盘制作 DP悬线法

    题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8 \times 88×8大小的黑白相间的方阵,对应八八六十四卦,黑白 ...

  8. 棋盘问题 ( POJ -1321 )(简单DFS)

    转载请注明出处:https://blog.csdn.net/Mercury_Lc/article/details/82684942   作者:Mercury_Lc 题目链接 题解:dfs入门,就是每个 ...

  9. 数位DP———POJ 3208 启示录

    POJ3208 启示录 题目传送门 题目大意:我们称只要某数字的十进制表示中有三个连续的6,我们就称它为"魔鬼数",比如:666,1666,6663,16666 等.现给出一个数X ...

最新文章

  1. Kotlin for 循环使用
  2. mybatis 注解 动态sql_Mybatis 的动态 SQL 语句
  3. 知乎网解决HTML5 Placeholder的方案
  4. VIJOS国庆节模拟赛之繁星春水
  5. oracle分区交换有啥好处,分区交换的速度为什么快?
  6. Spring MVC控制器用@ResponseBody声明返回json数据报406的问题
  7. 十一、飞机大战(IVX 快速开发教程)
  8. tomcat7的数据库连接池tomcatjdbc的25个优势
  9. 华为悬红“奥林帕斯奖”,促进数据产业基础技术研究与生态建设
  10. 谷歌为开源的漏扫工具“海啸“发布新的补丁奖励计划
  11. 从传统ICT到互联网的技术之路
  12. office2007设置默认粘贴为选择性粘贴
  13. 美国住宅IP和机房Ip的区别
  14. Wiki开源软件介绍
  15. 每天劝你辞职的同事,反而是公司待最久的
  16. 什么叫做私有网络VPC?
  17. qq家园里游戏c语言,盘点腾讯旗下5款过气游戏,全部玩过的人都该结婚了吧
  18. linux 电源管理源码分析,Linux 3.8.1 电源管理之OMAP Voltage Domain分析
  19. ae如何把已有图片当做蒙版_AE遮罩教程,如何用AE创建文字蒙版遮罩
  20. c语言面试题东软,【东软集团程序员Java东软集团C语言面试题】面试问题:东软java面… - 看准网...

热门文章

  1. 前端学习(3345):设计模式之工厂模式2
  2. 前端学习(3304):函数组件组件父组件子组件forwarRef聚焦
  3. 前端学习(3146):react-hello-react之getDenvied
  4. 前端学习(3135):react-hello-react之函数的柯里化
  5. [html] input上传文件可以同时选择多张吗?怎么设置?
  6. PS教程第十七课:放大看 缩小看
  7. [css] 举例说明shape-outside的属性的用途有哪些?
  8. [js] 根据元素ID遍历树形结构,查找到所有父元素ID
  9. 工作135:引用当前组件下面的方法是混入
  10. 前端学习(1809):前端调试之微博头部开发