poj - 1191 - 棋盘切割(dp)
题意:将一个8*8的棋盘(每一个单元正方形有个分值)沿直线(竖或横)割掉一块,留下一块,对留下的这块继续这样操作,总共进行n - 1次,得到n块(1 < n < 15)矩形,每一个矩形的分值就是单元正方形的分值的和,问这n个矩形的最小均方差。
id=1191">http://poj.org/problem?
——>>此题中。均方差比較,等价于方差比較,等价于平方和比較。
。
状态:dp[x1][y1][x2][y2][i]表示将(x1, y1)到(x2, y2)的矩形切割i次的最小平方和。
状态转移方程:dp[x1][y1][x2][y2][i] = min(dp[x1][y1][j][y2][i - 1] + nSquare[j + 1][y1][x2][y2], dp[j + 1][y1][x2][y2][i - 1] + nSquare[x1][y1][j][y2], );(水平方向分割)
dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][j][i - 1] + nSquare[x1][j + 1][x2][y2], dp[x1][j + 1][x2][y2][i - 1] + nSquare[x1][y1][x2][j]);(竖直方向分割)
两个方向再取最小值。
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using std::sqrt;
- using std::min;
- const int WIDTH = 8;
- const int MAXN = 15 + 1;
- const int INF = 0x3f3f3f3f;
- int a[WIDTH + 1][WIDTH + 1];
- int nSum[WIDTH + 1][WIDTH + 1][WIDTH + 1][WIDTH + 1];
- int nSquare[WIDTH + 1][WIDTH + 1][WIDTH + 1][WIDTH + 1];
- int dp[WIDTH + 1][WIDTH + 1][WIDTH + 1][WIDTH + 1][MAXN];
- void Init()
- {
- memset(nSum, 0, sizeof(nSum));
- for (int x1 = 1; x1 <= WIDTH; ++x1)
- {
- for (int y1 = 1; y1 <= WIDTH; ++y1)
- {
- for (int x2 = x1; x2 <= WIDTH; ++x2)
- {
- for (int y2 = y1; y2 <= WIDTH; ++y2)
- {
- nSum[x1][y1][x2][y2] = nSum[x1][y1][x2 - 1][y2] + nSum[x1][y1][x2][y2 - 1] - nSum[x1][y1][x2 - 1][y2 - 1] + a[x2][y2];
- nSquare[x1][y1][x2][y2] = nSum[x1][y1][x2][y2] * nSum[x1][y1][x2][y2];
- dp[x1][y1][x2][y2][0] = nSquare[x1][y1][x2][y2];
- }
- }
- }
- }
- }
- void Dp(int n)
- {
- for (int i = 1; i <= n - 1; ++i)
- {
- for (int x1 = WIDTH; x1 >= 1; --x1)
- {
- for (int y1 = 1; y1 <= WIDTH; ++y1)
- {
- for (int x2 = x1; x2 <= WIDTH; ++x2)
- {
- for (int y2 = y1; y2 <= WIDTH; ++y2)
- {
- dp[x1][y1][x2][y2][i] = INF;
- for (int j = x1; j < x2; ++j)
- {
- dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][y2][i], dp[x1][y1][j][y2][i - 1] + nSquare[j + 1][y1][x2][y2]);
- dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][y2][i], dp[j + 1][y1][x2][y2][i - 1] + nSquare[x1][y1][j][y2]);
- }
- for (int j = y1; j < y2; ++j)
- {
- dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][y2][i], dp[x1][y1][x2][j][i - 1] + nSquare[x1][j + 1][x2][y2]);
- dp[x1][y1][x2][y2][i] = min(dp[x1][y1][x2][y2][i], dp[x1][j + 1][x2][y2][i - 1] + nSquare[x1][y1][x2][j]);
- }
- }
- }
- }
- }
- }
- }
- void Output(int n)
- {
- double fAvg = 1.0 * nSum[1][1][8][8] / n;
- printf("%.3f\n", sqrt(1.0 * dp[1][1][8][8][n - 1] / n - fAvg * fAvg));
- }
- void Read()
- {
- for (int i = 1; i <= WIDTH; ++i)
- {
- for (int j = 1; j <= WIDTH; ++j)
- {
- scanf("%d", &a[i][j]);
- }
- }
- }
- int main()
- {
- int n;
- while (scanf("%d", &n) == 1)
- {
- Read();
- Init();
- Dp(n);
- Output(n);
- }
- return 0;
- }
poj - 1191 - 棋盘切割(dp)的更多相关文章
- poj 1191 棋盘切割 (压缩dp+记忆化搜索)
一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...
- poj 1191 棋盘分割(dp + 记忆化搜索)
题目:http://poj.org/problem?id=1191 黑书116页的例题 将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方. 可以看出来 方差只与 每一块的和的平方 ...
- POJ 1191 棋盘分割(DP)
题目链接 大体思路看,黑书...其他就是注意搞一个in数组,这样记忆化搜索,貌似比较快. #include <cstdio> #include <cstring> #inclu ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- POJ - 1191 棋盘分割 记忆递归 搜索dp+数学
http://poj.org/problem?id=1191 题意:中文题. 题解: 1.关于切割的模拟,用递归 有这样的递归方程(dp方程):f(n,棋盘)=f(n-1,待割的棋盘)+f(1,割下的 ...
- (中等) POJ 1191 棋盘分割,DP。
Description 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次 ...
- POJ 1191 棋盘分割(DP)
题目链接 题意 : 中文题不详述. 思路 : 黑书上116页讲的很详细.不过你需要在之前预处理一下面积,那样的话之后列式子比较方便一些. 先把均方差那个公式变形, 另X表示x的平均值,两边平方得 平均 ...
- POJ 1191 棋盘分割 (区间DP,记忆化搜索)
题面 思路:分析公式,我们可以发现平均值那一项和我们怎么分的具体方案无关,影响答案的是每个矩阵的矩阵和的平方,由于数据很小,我们可以预处理出每个矩阵的和的平方,执行状态转移. 设dp[l1][r1][ ...
随机推荐
- java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method 解决办法
java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an in ...
- 实习医生格蕾第十三季/全集Grey’s Anatomy迅雷下载
英文全名Grey's Anatomy,第13季(2016)ABC.本季看点:<实习医生格蕾>(Grey’s Anatomy)上季终集里,又一名资深演员离开了——Sara Ramirez扮演 ...
- Android之用自定义的shape去实现shadow效果
直接上xml文件, 并且附上相应的解析: <?xml version="1.0" encoding="utf-8"?> <selector x ...
- java 生成zip文件并导出
总结一下,关于Java下载zip文件并导出的方法,浏览器导出. String downloadName = "下载文件名称.zip"; downloadName = Browser ...
- MECE分析法(Mutually Exclusive Collectively Exhaustive)
什么是MECE分析法? MECE,是Mutually Exclusive Collectively Exhaustive,中文意思是“相互独立,完全穷尽”. 也就是对于一个重大的议题,能够做到不重叠. ...
- cannot be resolved. It is indirectly referenced from required .class files
缺少引用. 把缺少的引用在导入一下...如果是mavan 在当前moudle里也要把 dependency加进来
- Lucene的查询语法,JavaCC及QueryParser(1)
http://www.cnblogs.com/forfuture1978/archive/2010/05/08/1730200.html 一.Lucene的查询语法 Lucene所支持的查询语法可见h ...
- css的overflow属性
原文:https://www.jianshu.com/p/67b536fc67c1 ------------------------------------------- 事实上我挺长一段时间都没弄清 ...
- Linux系统中关于Sqlite3中文乱码问题及解决办法
新做的一个项目在本地(Win8)测试时没有问题,但传到服务器(Linux)时从Sqlite3数据库查询到的数据中文却是乱码(数据库中是正常的) 将php文件.html文件都设置成统一的utf8还是一样 ...
- Linux解决安装包无法找到问题Unable to locate package rar
1:问题 在默认安装的Linux中有时候会找不到需要安装的软件包,那就需要更新了 例如在执行apt-get install xx的时候就报错了 E: Unable to locate package ...