poj 1191 棋盘分割 动态规划
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 11457 | Accepted: 4032 |
Description
原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差
,其中平均值
,x
i为第i块矩形棋盘的总分。
请编程对给出的棋盘及n,求出O'的最小值。
Input
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。
Output
Sample Input
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
Sample Output
1.633
Source Code Problem: 1191
Memory: 596K Time: 0MS
Language: C++ Result: Accepted
Source Code
#include <iostream>
#include <cmath>
using namespace std;
const int maxint = 2000000000;
# define N 8
double ans;
int map[ N+1 ][ N+1 ], n;
int sum[ N+1 ][ N+1 ];
int f[16][ N+1 ][ N+1 ][ N+1 ][ N+1 ];
void init(){
for (int i = 1; i <= N; i ++)
for (int j = 1; j <= N; j++)
scanf("%d", &map[i][j]);
}
void output(){ printf("%.3lf\n", ans); }
int cal_sum(int x1, int y1, int x2, int y2){
int tmp = sum[x2][y2]+sum[x1-1][y1-1] - sum[x1-1][y2]-sum[x2][y1-1];
return tmp*tmp;
}
void dp(){
memset(sum, 0, sizeof(sum));
int tmp;
sum[0][0] = 0;
for (int i = 1; i <= N; i ++)
for (int j = 1; j <= N; j ++)
sum[i][j] = sum[i][j-1]+sum[i-1][j] - sum[i-1][j-1] + map[i][j];
memset(f, 0, sizeof(f));
for(int x1 = 1; x1 <= N; x1 ++)
for (int y1 = 1; y1 <= N; y1 ++)
for (int x2 = x1; x2 <= N; x2 ++)
for (int y2 = y1; y2 <= N; y2 ++)
f[1][x1][y1][x2][y2] = cal_sum(x1, y1, x2, y2);
for (int k = 2; k <= n; k ++)
for (int x1 = 1; x1 <= N; x1 ++)
for (int y1 = 1; y1 <= N; y1 ++)
for (int x2 = x1; x2 <= N; x2 ++)
for (int y2 = y1; y2 <= N; y2 ++){
f[k][x1][y1][x2][y2] = maxint;
for (int x = x1; x < x2; x ++){
tmp = min(f[k-1][x1][y1][x][y2] + cal_sum(x+1, y1, x2, y2),
f[k-1][x+1][y1][x2][y2] + cal_sum(x1, y1, x, y2));
if (f[k][x1][y1][x2][y2] > tmp) f[k][x1][y1][x2][y2] = tmp;
}
for (int y = y1; y < y2; y ++){
tmp = min( f[k-1][x1][y1][x2][y] + cal_sum(x1, y+1, x2, y2),
f[k-1][x1][y+1][x2][y2] + cal_sum(x1, y1, x2, y) );
if (f[k][x1][y1][x2][y2] > tmp) f[k][x1][y1][x2][y2] = tmp;
}
}
ans = sqrt( f[n][1][1][N][N]/(double)n - sum[N][N]*sum[N][N]/(double)(n*n));
}
int main()
{
while (scanf("%d", &n) != EOF){
init();
dp();
output();
}
return 0;
}
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: 11213 Accepted: 3951 Description 将一个 ...
- POJ 1191棋盘分割问题
棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...
- OpenJudge/Poj 1191 棋盘分割
1.链接地址: http://bailian.openjudge.cn/practice/1191/ http://poj.org/problem?id=1191 2.题目: 总时间限制: 1000m ...
- (中等) 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的平均值,两边平方得 平均 ...
随机推荐
- 服务--web服务
.面向对象和面向组件 .什么是Web服务 Web Service "Stack" .Web服务的应用分类 Web服务都是对象/组件技术在Internet中的延伸 面向对象和面向组件 ...
- 关于<img>标签与文字垂直居中
要让左边的图片与后面的文字居中,如下效果 HTML代码: <img class="iconCls" alt="最新客户端" src="${bas ...
- 转:MVC2表单验证失败后,直接返回View,已填写的内容就会清空,可以这样做;MVC2输出文本;MVC2输出PDF文件
ViewData.ModelState.AddModelError("FormValidator", message); foreach (string field in Requ ...
- 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...
- 无线端不响应键盘事件(keydown,keypress,keyup)
今天在项目时,在android手机上使用输入法的智能推荐的词的话,不会触发keyup事件,一开始想到在focus时使用一个定时器,每隔100ms检测输入框的值是否发生了改变,如果改变了就作对应的处理, ...
- 安装服务Memcached+Nginx+Php linux下安装
Memcached安装 1. 源码安装libevent(下载地址:http://monkey.org/~provos/libevent/) 2. 源码安装memcached(下载地 ...
- 转《深入理解Java虚拟机》学习笔记之最后总结
编译器 Java是编译型语言,按照编译的时期不同,编译器可分为: 前端编译器:其实叫编译器的前端更合适些,它把*.java文件转变成*.class文件,如Sun的Javac.Eclipse JDT中的 ...
- 【转】Github轻松上手1-Git的工作原理与设置
转自:http://blog.sina.com.cn/s/blog_4b55f6860100zzgp.html 作为一个程序猿,如果没有接触过stack overflow和Github,就如同在江湖中 ...
- 【原创】利用Windows系统日志统计员工每天上下班考勤时间
利用Windows系统日志统计员工每天上下班考勤时间(命令行参数为统计月份): using System; using System.Collections.Generic; using System ...
- NEUOJ711 异星工厂 字典树+贪心
题意:你可以收集两个不相交区间的权值,区间权值是区间异或,问这两个权值和最大是多少 分析:很多有关异或求最大的题都是利用01字典树进行贪心,做这个题的时候我都忘了...最后是看别人代码的时候才想起来这 ...