题目传送门:http://poj.org/problem?id=1191

棋盘分割

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 16150   Accepted: 5768

Description

将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 

原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 
均方差 
其中平均值 
xi为第i块矩形棋盘的总分。 
请编程对给出的棋盘及n,求出O'的最小值。 

Input

第1行为一个整数n(1 < n < 15)。 
第2行至第9行每行为8个小于100的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。 

Output

仅一个数,为O'(四舍五入精确到小数点后三位)。

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

 

题意概括:

中文题,不容小觑。

解题思路:

一、DFS搜索,每次分割棋盘可以选择两个方向 横切(改变Y的范围) 或者 竖切(改变X的范围);选择切割方向之后需要选择舍弃两部分之中的其中一部分,继续DFS另一部分。
二、但单纯的搜索太慢,我们可以发现其实是因为有很多子问题重叠,所以不妨用一个四维数组记录每次小矩形的运算结果,数组下标为小矩阵左上角和右下角的坐标。
三、公式化简:
 
AC code:
 ///POJ 1191 棋盘分割 (记忆化搜索经典)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF 0x3f3f3f3f
#define ll long long int
#define mod 1000000007
using namespace std; const int MAXN = ;
const int MAXM = ;
double d[MAXN][MAXM][MAXM][MAXM][MAXM];
double record[MAXM][MAXM][MAXM][MAXM];
double mmp[MAXM][MAXM];
double sum, ave;
int N; double get_sum(int x1, int y1, int x2, int y2)
{
if(record[x1][y1][x2][y2]>=) return record[x1][y1][x2][y2];
double re = ;
for(int i = x1; i <= x2; i++)
for(int j = y1; j <= y2; j++)
re+=mmp[i][j];
record[x1][y1][x2][y2] = re*re;
return record[x1][y1][x2][y2];
} double dfs(int x1, int y1, int x2, int y2, int cnt)
{
if(d[cnt][x1][y1][x2][y2]>=) return d[cnt][x1][y1][x2][y2];
if(cnt == N)
{
return get_sum(x1, y1, x2, y2);
}
double min_sum = ;
double tp = ;
for(int i = x1; i < x2; i++)
{
tp = get_sum(x1, y1, i, y2) + dfs(i+, y1, x2, y2, cnt+);
if(min_sum > tp) min_sum = tp;
tp = get_sum(i+, y1, x2, y2) + dfs(x1, y1, i, y2, cnt+);
if(min_sum > tp) min_sum = tp;
}
for(int j = y1; j < y2; j++)
{
tp = get_sum(x1, y1, x2, j) + dfs(x1, j+, x2, y2, cnt+);
if(min_sum > tp) min_sum = tp;
tp = get_sum(x1, j+, x2, y2) + dfs(x1, y1, x2, j, cnt+);
if(min_sum > tp) min_sum = tp;
}
d[cnt][x1][y1][x2][y2] = min_sum;
return min_sum;
} int main()
{
scanf("%d", &N);
memset(d, -, sizeof(d));
memset(record, -, sizeof(record));
for(int i = ; i <= ; i++)
for(int j = ; j <= ; j++)
{
scanf("%lf", &mmp[i][j]);
sum+=mmp[i][j];
}
ave = sum/(N*1.0);
ave*=ave;
double res = dfs(, , , , );
double ans = sqrt(res/N-ave);
printf("%.3f\n", ans);
return ;
}
 
 
 

POJ 1191 棋盘分割 【DFS记忆化搜索经典】的更多相关文章

  1. poj 1191 棋盘分割(dp + 记忆化搜索)

    题目:http://poj.org/problem?id=1191 黑书116页的例题 将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方. 可以看出来 方差只与 每一块的和的平方 ...

  2. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  3. poj 3249(bfs+dp或者记忆化搜索)

    题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...

  4. 不要62 hdu 2089 dfs记忆化搜索

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...

  5. dfs+记忆化搜索,求任意两点之间的最长路径

    C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...

  6. POJ 2704 Pascal's Travels 【DFS记忆化搜索】

    题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Tota ...

  7. POJ 1088 滑雪 DFS 记忆化搜索

    http://poj.org/problem?id=1088 校运会放假继续来水一发^ ^ 不过又要各种复习,功课拉下了许多 QAQ. 还有呀,就是昨天被一个学姐教育了一番,太感谢了,嘻嘻^ ^ 好了 ...

  8. poj1088-滑雪 【dfs 记忆化搜索】

    http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79806 ...

  9. BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)

    Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...

随机推荐

  1. ajax请求方法及参数说明

    $.ajax()请求示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  2. dockerfile 语法

    基本语法格式:INSTRUCTION arguments (指令+参数)不分大小写 注释格式:# 注释 第一个指令必须是FROM,标示使用什么镜像 1.解析器指令 解析器指令是可选的,并且影响处理Do ...

  3. 写些最近两个学安卓的笔记-关于Toast

    1.Toast可以在Activity和service里使用,在Service里使用时,Toast是显示在当前的Activity上. 2.Toast出现时,当前的Activity依然可见可交互. 3.T ...

  4. Docker概念学习系列之Docker是什么?(1)

    不多说,直接上 干货! Docker是什么?   见[博主]撰写的 https://mp.weixin.qq.com/s/iWAzj7baD93hexsVJ7pBfQ  Docker是一个开源的应用容 ...

  5. Fragment、Activity比较——Android碎片介绍

    Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似,下面介绍下Android Fragment的作用和用法.Fragmen ...

  6. 为什么一段时间后网站后台自动退出 php中session过期时间设置

    修改php配置文件中的session.gc_maxlifetime.如果想了解更多session回收机制,继续阅读.(本文环境php5.2) 概述:每一次php请求,会有1/100的概率(默认值)触发 ...

  7. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以"焕启"为主题的腾讯"云+未来"峰会再广州召开,广东省各级政府机构领导.海 ...

  8. 安恒杯11月月赛web题目-ezsql详细记录

    通过此题目可以学习到 1.通过load_file+like来盲注获取文件内容 2.php魔术方法__get函数的用法 3.bypass  linux命令过滤 题目中给了注册和登录的功能,没有源码泄露 ...

  9. CTSC/APIO2018 游记

    狗牌滚粗选手,此博客证明我去过...... CTSC 消失的源代码与消失的分数...... 我也不知道发生了什么....... APIO 旁边两位小哥太强了,心态完全炸裂,最后也滚粗了...... 回 ...

  10. (一)环境安装之Java

    一.安装JDK 点击 JDK8下载,根据自己的平台,选择相应的版本进行下载. Java环境分JDK和JRE ,JDK就是Java Development Kit. 简单的说JDK是面向开发人员使用的S ...