棋盘切割 DP POJ 1191

把方差公式先变形为 σ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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lucene,lucene.net学习教程

lucene学习教程 1.1 什么是lucene Lucene是一个全文搜索框架&#xff0c;而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用&#xff0c;它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式 lucene提供的服务实际包含两部分&#xf…

python 使用 pip 安装第三方库 导入不成功

本文是什么意思呢&#xff1f; 就是你需要使用一些库安装老师或者网上说的 通过pip 安装下载了第三方库&#xff0c;但是使用 import xxx from xxx import xx &#xff0c;pycharm ide 导入的下面还有红色波浪线&#xff0c;导入不成功。 这是什么原因&#xff1f; 这是pyc…

SIFT算法

介绍这个算法的网上的博客很多&#xff0c;这个百度一下就有很多篇&#xff0c;我写一下我的认识。 前面考虑的一个图像的特征点是角点&#xff0c;这边提出了&#xff0c;图像的特征点可以是一个斑点&#xff0c;就像 明显的就是部分向日葵的原型就是一个特征&#xff0c;而这…

PHP中过滤数组中的元素

演示使用自定义函数删除数组中的偶数元素。 <?php function myfunc(&$arr){//自定义一个过滤函数$jcount($arr);for($i0;$i<$j;$i){if($arr[$i]%20)unset($arr[$i]);} }$arrarray(23,14,37,263,244,379,100,153,150);//定义一个数组 echo 数组进行过滤之前的信息&am…

Schema evolution in Avro, Protocol Buffers and Thrift

http://martin.kleppmann.com/2012/12/05/schema-evolution-in-avro-protocol-buffers-thrift.html 当想要数据, 比如对象或其他类型的, 存到文件或是通过网络传输, 需要面对的问题是序列化问题 对于序列化, 当然各个语言都提供相应的包, 比如, Java serialization, Ruby’s ma…

林俊卿咽音练声法八个步骤(纯净版视频加图文)(转)

原文链接&#xff1a;http://zgwhyyj.blog.sohu.com/81794726.html 读原著一直是研究者提倡的正确获得原创资料及其精神方法的一种最佳方式!观察了“土豆”和“我乐”、“新浪”等网站中关于“林俊卿咽音练声法八个步骤”的视频&#xff0c;内容中穿插的“经历、荣誉、传人”等…

VS 2012 找回消失的“创建单元测试”

日前&#xff0c;看到91哥的分享&#xff0c;聽說&#xff0c;建立單元測試的選單回來了!!! 得知這消息真的又驚又喜&#xff0c;馬上就照著以下步驟實作一次。 http://serena-yeoh.blogspot.tw/2013/02/visual-studio-2012-create-unit-test.html 不過在動手實作的時候&#x…

(JAVA)集合Collection3

package cn.cast.collection;/*** author zhangyu* date 2021年08月28日 4:12 下午* 使用集合存储自定义对象&#xff0c;并迭代* 在迭代器中&#xff0c;next()在运行中&#xff0c;不能添加对象&#xff0c;且不能多次使用*/ import cn.book.objectarr.Student;import java.u…

【零基础学习iOS开发】【02-C语言】05-进制

上一讲简单介绍了常量和变量&#xff0c;这讲补充一点计算机的基础知识---进制。 我们先来看看平时是如何表示一个整数的&#xff0c;最常见的肯定是用阿拉伯数字表示&#xff0c;比如“十二”&#xff0c;我们可以用12来表示&#xff0c;其实这种表示方式是基于一种叫做“十进…