POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191
棋盘分割
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 16150 | Accepted: 5768 |
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
题意概括:
解题思路:
///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记忆化搜索经典】的更多相关文章
- poj 1191 棋盘分割(dp + 记忆化搜索)
题目:http://poj.org/problem?id=1191 黑书116页的例题 将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方. 可以看出来 方差只与 每一块的和的平方 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- poj 3249(bfs+dp或者记忆化搜索)
题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...
- 不要62 hdu 2089 dfs记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- POJ 2704 Pascal's Travels 【DFS记忆化搜索】
题目传送门:http://poj.org/problem?id=2704 Pascal's Travels Time Limit: 1000MS Memory Limit: 65536K Tota ...
- POJ 1088 滑雪 DFS 记忆化搜索
http://poj.org/problem?id=1088 校运会放假继续来水一发^ ^ 不过又要各种复习,功课拉下了许多 QAQ. 还有呀,就是昨天被一个学姐教育了一番,太感谢了,嘻嘻^ ^ 好了 ...
- poj1088-滑雪 【dfs 记忆化搜索】
http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 79806 ...
- BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)
Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...
随机推荐
- oracle 错误实例分析(ORA-01078)
01,问题描述 心血来潮想看一下启动数据库的alert log.然后把数据库给关闭了,同时也在监听日志文件 下面可谓是详细的描述了整个关机过程,也看到了无数的error [root@node1 ...
- (转)source、sh、bash、./执行脚本的区别
source.sh.bash../执行脚本的区别 原文:https://www.cnblogs.com/sparkbj/p/5976100.html 1.source命令用法: source Fil ...
- MySQL关联left join 条件on与where不同
以下的文章主要讲述的是MySQL关联left join 条件on与where 条件的不同之处,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两 ...
- linux下统计文本行数的各种方法(二)
上一篇讲的都是统计单个文件的方法,直接在命令行执行就可以.现在试试脚本的方式,统计多个文件的行数 一.统计目录下所有文件的文件数及所有行数 脚本暂时命名为count.sh,代码如下: #!/bin/b ...
- WPF中嵌入Skyline提供的COM组件填坑
网上有很多关于在WPF中使用的Skyline提供的COM组件的教程,但大都雷同一律,其中很多的细节均为涉及,本文意在在其原基础上进行一些细节的补充. 工具:Visual Studio 2017 1. ...
- 【Linux】Linux系统启动过程
1.Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段: 内核的引导. 运行 init. 系统初始化. 建立终端 . 用户登录系统. 1.Linux系统的启动过程并不是大家想象 ...
- Use the list and while to Build Shop car
#Author: Gordonsalary = int(input("请输入你的工资:"))goods = [('0',"Iphone",5000),('1', ...
- SQL Server日期格式化
0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM) 1 101 美国 mm/dd/yyyy ...
- iDempiere 使用指南 测试 及 开发 虚拟机下载
Created by 蓝色布鲁斯,QQ32876341,blog http://www.cnblogs.com/zzyan/ iDempiere官方中文wiki主页 http://wiki.idemp ...
- vim右键粘贴 等杂
putty连上linux,vim编辑个文件,我去,右键不能用用上下面的命令,就好了. set mouse-=a 今天发现mysql倒入utf-8的文件网站显示出来都是乱码,不过用utf-8的控制台看是 ...