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)次后,原矩阵被分割成 ...
随机推荐
- java中构造函数的特点
构造函数的名字必须和类名完全相同,构造函数不能有 返回值,就是void 也不要写,构造函数不可以被子类继承 构造函数可以重载但是不可以被子类覆盖. 简单的例子 class A{ A(){ } A(in ...
- 案例43-crm练习获取客户列表使用struts2
1 src下配置文件 1 struts.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYP ...
- Unity3D之OnGUI知识总结
相对位置参考 http://blog.csdn.net/sunny__chen/article/details/51323265 自适应屏幕收缩 http://www.360doc.com/co ...
- Java入门系列-09-循环结构
这篇文章为你搞懂5个问题 while 循环如何使用 do-while 循环的使用 for 循环的使用 break.continue 的使用 循环结构的嵌套使用 生活中有很多事情需要我们重复的去做,比如 ...
- HDU 1257——最少拦截系统——————【LIS变型题】
最少拦截系统 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- js event事件绑定的方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- js获取当前日期,格式为YYYY-MM-DD
//获取当前时间,格式YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = "-& ...
- java 获取网络地址图片
收藏一个获取网络图片的方法. //获取网络图片 public void ImageRequest(String ImageName,String GifUrl) throws Exception { ...
- Spring.NET入门
Spring.NET入门 http://www.cnblogs.com/haogj/archive/2011/06/10/2077540.html http://www.cnblogs.com/ha ...
- Promise/A+规范学习总结
Promise的实现:因为他只是一个规范,所以在不同的框架或者平台下有不同的实现 Angular:$q服务 Node:q模块,co,then Es6:Promise, yield Es7:async ...