poj 1191 棋盘分割(dp + 记忆化搜索)
题目:http://poj.org/problem?id=1191
黑书116页的例题
将方差公式化简之后就是 每一块和的平方 相加/n , 减去平均值的平方。
可以看出来 方差只与 每一块的和的平方有关,所以就是求每个矩形的总分的平方和 尽量小。。。。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int INF = <<;
int sum[][], d[][][][][];//sum存储从【1,1】到【i, j】的和
int _min(int a, int b)
{
return a>b?b:a;
}
int getsum(int x1, int y1, int x2, int y2) //计算从【x1,y1】到【x2, y2】的和。
{
return sum[x2][y2]-sum[x1-][y2]-sum[x2][y1-]+sum[x1-][y1-];
}
int slove(int k, int x1, int y1, int x2, int y2)
{
int s1, s2, Min, temp1, temp2;
int i;
if(d[k][x1][y1][x2][y2]!=-) //不等于1表示已经求过了,不需要再求了
return d[k][x1][y1][x2][y2];
if(k == ) //表示已经切了n块了,不需要再切了
{
s1 = getsum(x1, y1, x2, y2);
return (d[k][x1][y1][x2][y2] = s1*s1);
}
Min = INF;
for(i = x1; i < x2; i++) //横向切
{
s1 = getsum(x1, y1, i, y2);
s2 = getsum(i+, y1, x2, y2);
temp1 = _min(slove(k-, i+, y1, x2, y2)+s1*s1, slove(k-, x1, y1, i, y2)+s2*s2);
if(temp1 < Min)
Min = temp1;
}
for(i = y1; i < y2; i++) //纵向切
{
s1 = getsum(x1, y1, x2, i);
s2 = getsum(x1, i+, x2, y2);
temp2 = _min(slove(k-, x1, i+, x2, y2)+s1*s1, slove(k-, x1, y1, x2, i)+s2*s2);
if(temp2 < Min)
Min = temp2;
}
return (d[k][x1][y1][x2][y2] = Min);
}
int main()
{
int n, i, j, val, x;
double aver, var;
while(~scanf("%d", &n))
{
memset(d, -, sizeof(d));
memset(sum, , sizeof(sum));
for(i = ; i <= ; i++)
for(j = , x = ; j <= ; j++)
{
scanf("%d", &val);
x += val;
sum[i][j] = sum[i-][j] + x;
}
aver = sum[][]*1.0/n; //所有块的平方和
int sum_t = slove(n, , , , );
var = sqrt(sum_t*1.0/n-aver*aver); printf("%.3lf\n", var);
}
return ;
}
poj 1191 棋盘分割(dp + 记忆化搜索)的更多相关文章
- POJ 1191 棋盘分割(DP)
题目链接 大体思路看,黑书...其他就是注意搞一个in数组,这样记忆化搜索,貌似比较快. #include <cstdio> #include <cstring> #inclu ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
随机推荐
- MongoDB工具MagicMongoDBTool
MagicMongoDBTool工具是一款MongoDB的数据库管理工具,用来进行简单的数据库管理工作. 此工具为国人开发,项目地址:MagicMongoDBTool,目前作者已经完成基本功能开发. ...
- js eval()执行传参函数的写法
.cs public class Message<T> { // 数据总数 public int? Total { get; set; } // 关键数据 public List<T ...
- 一个完整openlayer的例子,包括marker,popup等
整理转自:http://www.blogjava.net/siriusfx/archive/2007/11/26/163104.html openlayers提供了几十个示例,虽然每个示例都很简单,但 ...
- Jquery 查看DOM上绑定的事件列表
$(dom).data( "events" ); 包括事件类型和关联的处理函数 下面是firefox的截图
- sampler2d
Here is the syntax for a sampler in Direct3D 9. sampler Name = SamplerType{ Texture = <texture_ ...
- mysql之sql语句导入与导出讲解
导出SQL:mysqldump -u root -p 数据库名 [表名1 表名2] > 输出地址其中表名可选 本机测试实例:
- 01-03-03【Nhibernate (版本3.3.1.4000) 出入江湖】cascade的测试
相关文章: http://www.cnblogs.com/amboyna/archive/2008/02/18/1072260.html注意上面是hibernate,不是Nhibernate,这解释是 ...
- hdu 1879 继续畅通工程(最小生成树,基础)
题目 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<algo ...
- spark在eclipse上配置
环境:spark1.4.0,hadoop2.6.0 1.安装好jdk 2.在spark的conf目录下找到spark-env.sh.template,打开,在后面加上 export SCALA_HOM ...
- C# Regex类用法
使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现全部匹配输出 string str = "test43232 ...