POJ1991 NOI1999棋盘分割
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 15581 | Accepted: 5534 |
Description
原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差,其中平均值,xi为第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
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define dist(x1, y1, x2, y2) (g[(x2)][(y2)] - g[((x1) - 1)][(y2)] - g[(x2)][((y1) - 1)] + g[((x1) - 1)][((y1) - 1)]) inline void read(long long &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '')c = ch, ch = getchar();
while(ch <= '' && ch >= '')x = x * + ch - '', ch = getchar();
if(c == '-')x = -x;
} const long long MAXN = + ; long long n, g[][], dp[MAXN][][][][], sum; int main()
{
read(n);
for(register long long i = ;i <= ;++ i)
for(register long long j = ;j <= ;++ j)
{
read(g[i][j]);
sum += g[i][j];
g[i][j] = g[i - ][j] + g[i][j - ] - g[i - ][j - ] + g[i][j];
}
memset(dp, 0x3f, sizeof(dp));
//dp[i][x1][y1][x2][y2]表示把(x1,y1)(x2,y2)矩形切割成i块的最小平方和
for(register long long i = ;i <= n;++ i)
for(register long long x1 = ;x1 <= ;++ x1)
for(register long long y1 = ;y1 <= ;++ y1)
for(register long long x2 = ;x2 <= ;++ x2)
for(register long long y2 = ;y2 <= ;++ y2)
{
if(i == )
{
dp[i][x1][y1][x2][y2] = dist(x1, y1, x2, y2)*dist(x1, y1, x2, y2);
continue;
}
for(register long long a = x1;a < x2;++ a)
{
dp[i][x1][y1][x2][y2] = min(dp[i][x1][y1][x2][y2], dp[i - ][x1][y1][a][y2] + dist(a + , y1, x2, y2)*dist(a + , y1, x2, y2));
dp[i][x1][y1][x2][y2] = min(dp[i][x1][y1][x2][y2], dp[i - ][a + ][y1][x2][y2] + dist(x1, y1, a, y2)*dist(x1, y1, a, y2));
}
for(register long long a = y1;a < y2;++ a)
{
dp[i][x1][y1][x2][y2] = min(dp[i][x1][y1][x2][y2], dp[i - ][x1][y1][x2][a] + dist(x1, a + , x2, y2)*dist(x1, a + , x2, y2));
dp[i][x1][y1][x2][y2] = min(dp[i][x1][y1][x2][y2], dp[i - ][x1][a + ][x2][y2] + dist(x1, y1, x2, a)*dist(x1, y1, x2, a));
}
}
printf("%.3lf", (double)sqrt(((double)dp[n][][][][]*1.0/n) - ((double)sum*1.0/n) * ((double)sum*1.0/n)));
return ;
}
POJ1991
POJ1991 NOI1999棋盘分割的更多相关文章
- [NOI1999] 棋盘分割
COGS 100. [NOI1999] 棋盘分割 http://www.cogs.pro/cogs/problem/problem.php?pid=100 ★★ 输入文件:division.in ...
- [NOI1999] 棋盘分割(推式子+dp)
http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 156 ...
- POJ 1191 棋盘分割
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11213 Accepted: 3951 Description 将一个 ...
- poj 1191 棋盘分割 动态规划
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11457 Accepted: 4032 Description ...
- NOI 193棋盘分割.cpp
193:棋盘分割 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191棋盘分割问题
棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...
- 洛谷 P1436 棋盘分割 解题报告
P1436 棋盘分割 题目描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的两部分中的任意一块继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共 ...
- poj1191 棋盘分割【区间DP】【记忆化搜索】
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812 Description ...
随机推荐
- raft学习
http://thesecretlivesofdata.com/raft/ 选举 角色: leader 领导者 Follower跟随者 Candidate候选者 如果跟随者在一定时间内,么有收到领 ...
- mybatis 一对多和一对一写法注意事项
<resultMap id="ChartResultMap" type="com.qif.dsa.ucenter.planinfo.entity.ChartDate ...
- vue基础知识总结
vue不支持安卓6.0以下版本,切记!!! 1.创建vue实例 var vm = new Vue({ el: '#app', //所指向的dom的id data:{ }, //与dom元素绑定的数据 ...
- VS2010-如何建立并运行多个含有main函数的文件
一.先说两个概念,解决方案与工程 在VS2010中,工程都是在解决方案管理之下的.一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合. 每个应用程序都作为一个工程来处 ...
- iOS之UITableView加载网络图片cell自适应高度
#pragma mark- UITableView - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSI ...
- Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis
http://www.cnblogs.com/LittleHann/p/3992778.html
- BufferedReader用法
BufferedReader由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取一个文本行,从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的 ...
- 批量插入或更新操作之ON DUPLICATE KEY UPDATE用法
实际的开发过程中,可能会遇到这样的需求,先判断某一记录是否存在,如果不存在,添加记录,如果存在,则修改数据.在INSERT语句末尾指定ON DUPLICATE KEY UPDATE可以解决这类问题. ...
- 15_K-近邻算法之入住位置预测
案例:本次大赛的目的是预测一个人想签入到哪个地方.对于本次比赛的目的,Facebook的创建一 个人造的世界,包括位于10公里的10平方公里超过10万米的地方.对于一个给定的坐标,你的任务是返回最有可 ...
- python 中的 is 方法 总结
isidentifier: 判断变量名是否合法 iskeyword:是否为内置关键字