OpenJudge/Poj 1191 棋盘分割
1.链接地址:
http://bailian.openjudge.cn/practice/1191/
http://poj.org/problem?id=1191
2.题目:
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)
原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差,其中平均值
,xi为第i块矩形棋盘的总分。
请编程对给出的棋盘及n,求出O'的最小值。- 输入
- 第1行为一个整数n(1 < n < 15)。
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。- 输出
- 仅一个数,为O'(四舍五入精确到小数点后三位)。
- 样例输入
3
1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 1 0 3- 样例输出
1.633- 来源
- Noi 99
3.思路:
确定公式的常量
深搜+剪枝
4.代码:
#include <iostream>
#include <cstdio>
#include <cmath> #define NUM 8 using namespace std; double res_sigma; int n;
int arr[NUM][NUM]; double all_avg; double sigma; void dfs(int x1,int y1,int x2,int y2,int sum,int cut)
{
int k,i,j;
int temp_sum,temp_avg;
double temp; if(cut == )
{
temp = (sum - all_avg) * (sum - all_avg);
if(sigma + temp < res_sigma) {res_sigma = sigma + temp;}
return;
} temp_sum = ;
for(k = y1; k < y2; ++k)
{
for(j = x1; j <= x2; ++j) temp_sum += arr[k][j]; temp_avg = temp_sum;
temp = (all_avg - temp_avg) * (all_avg - temp_avg);
if(sigma + temp < res_sigma)
{
sigma += temp;
dfs(x1,k + ,x2,y2,sum - temp_sum,cut - );
sigma -= temp;
} temp_avg = sum - temp_sum;
temp = (all_avg - temp_avg) * (all_avg - temp_avg);
if(sigma + temp < res_sigma)
{
sigma += temp;
dfs(x1,y1,x2,k,temp_sum,cut - );
sigma -= temp;
} } temp_sum = ;
for(k = x1; k < x2; ++k)
{
for(i = y1; i <= y2; ++i) temp_sum += arr[i][k]; temp_avg = temp_sum;
temp = (all_avg - temp_avg) * (all_avg - temp_avg);
if(sigma + temp < res_sigma)
{
sigma += temp;
dfs(k + ,y1,x2,y2,sum - temp_sum,cut - );
sigma -= temp;
} temp_avg = sum - temp_sum;
temp = (temp_avg - all_avg) * (temp_avg - all_avg);
if(sigma + temp < res_sigma)
{
sigma += temp;
dfs(x1,y1,k,y2,temp_sum,cut - );
sigma -= temp;
} }
} int main()
{
//freopen("C://input.txt","r",stdin); cin >> n; int i,j; int sum = ;
for(i = ; i < NUM; ++i)
{
for(j = ; j < NUM; ++j)
{
cin >> arr[i][j];
sum += arr[i][j];
}
}
all_avg = sum * 1.0 / n; res_sigma = sum * sum * n; dfs(,,NUM - ,NUM - ,sum,n - ); cout.setf(ios::fixed);
cout.precision();
cout << sqrt(res_sigma / n) << endl; return ;
}
OpenJudge/Poj 1191 棋盘分割的更多相关文章
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- poj 1191 棋盘分割 动态规划
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11457 Accepted: 4032 Description ...
- POJ 1191 棋盘分割
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11213 Accepted: 3951 Description 将一个 ...
- POJ 1191棋盘分割问题
棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...
- (中等) POJ 1191 棋盘分割,DP。
Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...
- POJ - 1191 棋盘分割 记忆递归 搜索dp+数学
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...
- poj 1191 棋盘分割(dp + 记忆化搜索)
题目:http://poj.org/problem?id=1191 黑书116页的例题 将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方. 可以看出来 方差只与 每一块的和的平方 ...
- POJ 1191 棋盘分割(DP)
题目链接 题意 : 中文题不详述. 思路 : 黑书上116页讲的很详细.不过你需要在之前预处理一下面积,那样的话之后列式子比较方便一些. 先把均方差那个公式变形, 另X表示x的平均值,两边平方得 平均 ...
随机推荐
- .NET世界各成员之间的关系
相信看到这篇文章的人,心中肯定有这样的想法:ODBC.OLEDB.ADO.ADO.NET貌似都是访问数据库的东东,那么他们之间有什么区别,又有什么联系呢?不要着急,待我慢慢道来. 先说ODBC,官方的 ...
- xcode6.4 7.2下载地址
XCode 7.2 :ht tp://adcdownload.apple.com/Developer_Tools/Xcode_7.2/Xcode_7.2.dmgXCode7.1.1:ht tp://a ...
- JFinal使用笔记1-部署demo项目到本地tomcat
http://my.oschina.net/u/173975/blog/110261 尝试用JFinal开发个开源的社团管理系统,把开发过程中遇到的问题和解决办法记下来,以供参考. 部署jfinal_ ...
- CentOS命令行无线上网
(1)首先关闭开发板的有线网卡[root@FriendlyARM /]# ifconfig eth0 down(2)加载USB WiFi无线网卡[root@FriendlyARM /]# ifconf ...
- 编写一个程序,从标准输入中读取若干string对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要求记录连续重复出现的最大次数以及对应的单词
#include<iostream> #include<string> #include<vector> using namespace std; int main ...
- 手工配置tomcat 解决一闪而过~
双击tomcat 目录下的bin目录下的startup.bat 如果看到Server startup in **** ms 显示在屏幕上证明你的配置都成功了 如果一闪而过,说明出错了.请在dos进入上 ...
- 浅谈iOS中的视图优化
引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...
- focus on these tools
http://www.oschina.net/p/dubbo http://www.blogjava.net/hispark/archive/2008/12/01/243310.html http:/ ...
- CentOS7 service/chkconfig replace commands
对比表,以 apache / httpd 为例 任务 旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.serv ...
- java基础学习总结五(递归算法、冒泡排序、查看生成API)
一:递归算法 概念:自己调用自己的方法 示例代码如下: @Test /** * 递归求和 * 5+4+3+2+1=15 */ public void getSum() { long sum = sum ...

,其中平均值
,xi为第i块矩形棋盘的总分。