POJ1991 NOI1999棋盘分割
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 15581 | Accepted: 5534 |
Description

原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。
均方差
请编程对给出的棋盘及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 ...
随机推荐
- 通过Amazon AWS 十分钟搭建私人主机 自由的不要不要的
首先承认有点标题党了,当时自己搞的时候可不止十分钟,好吧,我承认是坑太多了,所以特意开了一篇博文,就是要准备尝试的和我一样的菜鸟们,可以真正的十分钟搞定. 当然高手可能用不上十分钟. 首先,就是 ...
- 深入浅出 Java Concurrency (29): 线程池 part 2 Executor 以及Executors[转]
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.真正的线程池接口是ExecutorService. 下面这张图完整描述了线程 ...
- iOS之CAGradientLayer属性简介和使用
1.CAGradientLayer简介 CAGradientLayer用于制作背景图层的颜色渐变,也就是颜色梯度!相关属性简介: #import <QuartzCore/CALayer.h> ...
- 微信小程序chooseImage(从本地相册选择图片或使用相机拍照)
一.使用API wx.chooseImage(OBJECT) var util = require('../../utils/util.js') Page({ data:{ src:"../ ...
- OpenCASCADE点向直线投影
OpenCASCADE点向直线投影 eryar@163.com 在GeomLib_Tool类中提供了计算指定点在曲线.曲面上的参数,这个算法具有通用性,即对任意曲线.曲面来反求点的参数. 本文主要结合 ...
- 05_springmvc参数绑定
一.参数绑定的过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上.springmvc中,接收页面提交的数据是通过方法形参来接收.而不 ...
- rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法-转
原文:http://raksmart.idcspy.com/781 在CentOS上的Canon LBP2900安装打印机驱动,中间遇到了一些问题,主要是安装rpm包出现的依赖问题,现在解决了,现在简 ...
- day71test
目录 练习: settings.py views.py: exception.py urls.py 练习: 视图类渲染,解析, 异常配置: 作业: 1..简单过过请求模块的源码流程,建立一个视图类,完 ...
- PKU--1267 Cash Machine(多重背包)
题目http://poj.org/problem?id=1276 分析 这是一个多重背包的问题,可以把请求的金额当作背包的重量,而货币的面值就是价值又是重量. 于是这个问题便很好理解背包了. #];; ...
- 使用Colaboratory的免费GPU训练神经网络
1 Colaboratory 介绍 Colaboratory 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果.它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并 ...