題目鏈接:http://poj.org/problem?id=1191

題意:中文題誒~

思路:這道題有幾個關鍵點需要想通,不然會比較難做...

首先,題目給出的標準差公式並不是很好計算,需要給它變下形:

ans = sqrt(sum(xi-x)^2/n) (其中x爲平均面積,xi爲某個矩形面積...

ans^2 = sum(xi-x)^2/n

   = sum(xi^2)/n - sum(2*xi*x)/n - sum(x^2)/n

   =sum(xi^2)/n - 2x*sum(xi)/n - n*x^2/n

   = sum(xi^2)/n - 2x*nx/n - x^2

   = sum(xi^2)/n - x^2

顯然 sum(xi^2)/n >= x^2,所以只要求得 min(sum(xi^2)/n) 即求得 min(sum(xi^2)) 即可;

对于求 min(sum(xi^2)) 显然可以用dfs解决(据说还可以dp), 不过这里的 i <15,太暴力会tle,需要加个记忆优化;

注意:由一对顶点可以确定一个矩形;

   题目要求只能对分割后得到的两个矩形其中一个继续分割;

   可以先对矩形预处理一下,sum(x, y) = sum(x-1, y) + sum(x, y-1) + value - sum(x-1, y-1),这样再计算单个矩形面积时会方便一些;

代码:

 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std; const int MAXN=;
const int inf=1e9;
int a[MAXN][MAXN], n;
int dp[MAXN][MAXN][MAXN][MAXN][MAXN+]; int area(int x1, int y1, int x2, int y2){
return a[x2][y2]-a[x2][y1-]-a[x1-][y2]+a[x1-][y1-];
} int dfs(int x1, int y1, int x2, int y2, int cnt){
if(dp[x1][y1][x2][y2][cnt]!=-) return dp[x1][y1][x2][y2][cnt];
if(cnt==n){
int gg=area(x1, y1, x2, y2);
return dp[x1][y1][x2][y2][cnt]=gg*gg;
}
int m=inf;
for(int i=x1; i<x2; i++){//注意这里是从x1开始,因为可以选择不切割
int l=area(x1, y1, i, y2);
int r=area(i+, y1, x2, y2);
m=min(m, min(dfs(x1, y1, i, y2, cnt+)+r*r, dfs(i+, y1, x2, y2, cnt+)+l*l));
}
for(int i=y1; i<y2; i++){//同理,这里是从y1开始
int l=area(x1, y1, x2, i);
int r=area(x1, i+, x2, y2);
m=min(m, min(dfs(x1, y1, x2, i, cnt+)+r*r, dfs(x1, i+, x2, y2, cnt+)+l*l));
}
return dp[x1][y1][x2][y2][cnt]=m;
} int main(void){
while(cin >> n){
memset(a, , sizeof(a));
memset(dp, -, sizeof(dp));
for(int i=; i<=; i++){
for(int j=; j<=; j++){
int x;
cin >> x;
a[i][j]=a[i-][j]+a[i][j-]-a[i-][j-]+x;
}
}
double avi=a[][]*1.0/n;
double cnt=dfs(, , , , )*1.0/n;
printf("%.3lf\n", sqrt(cnt-avi*avi));
}
return ;
}

poj1191(記憶化搜索)的更多相关文章

  1. poj1088(記憶化搜索)

    題目鏈接:http://poj.org/problem?id=1088 題意:中文題誒- 思路:dfs,不過直接dfs因該會超時,那我們給他加個記錄路徑就好了... 代碼: #include < ...

  2. poj1191 棋盘分割【区间DP】【记忆化搜索】

    棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16263   Accepted: 5812 Description ...

  3. Linux Kernel 記憶體管理機制之美<转>

    转自--http://five.rdaili.com/sohu.com.php?u=Mq3EniVnae0axim7jkGhH0IhA9uho6CQso7R1aYomXWJ9UemfwUQYmKRc8 ...

  4. bzoj1079--记忆化搜索

    题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...

  5. bzoj3208--记忆化搜索

    题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目.    我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...

  6. [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索

    1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...

  7. 【BZOJ-3895】取石子 记忆化搜索 + 博弈

    3895: 取石子 Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 263  Solved: 127[Submit][Status][Discuss] D ...

  8. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)

    递推型DP 将每个滑雪点都看作起点,从最低点开始逐个由四周递推出到达此点的最长路径的长度,由该点记下. 理论上,也可以将每一点都看作终点,由最高点开始计数,有兴趣可以试试. //经典DP-由高向低海拔 ...

随机推荐

  1. 网络新闻传输协议NNTP

    一.Usenet与新闻组 Usenet新闻系统是一个全球存档的“电子公告板”,各种主题的新闻组一应俱全.新闻组可以是面向全球泛泛而谈,也可以是只面向某一个地区区域. 整个系统是由一个大量计算机组成的一 ...

  2. 05-树8 File Transfer(25 point(s)) 【并查集】

    05-树8 File Transfer(25 point(s)) We have a network of computers and a list of bi-directional connect ...

  3. GDB打印内存命令

    用gdb查看内存 格式 x /nfu 参数说明 x是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, 可取如下值 x 按十六进制格式显示变量 d 按十进制格式显示变量 u 按十 ...

  4. nginx.config配置文件模板

    #user nobody;worker_processes 1; #error_log logs/error.log;#error_log logs/error.log notice;#error_l ...

  5. springAOP原理以及概念

    需求:1.拦截所有业务方法2.判断用户是否有权限,有权限就让他执行业务方法,没有权限就不允许执行.(是否有权限是根据user是否为null作为判断依据) 思考: 我们该如何实现? 思路1: 我们在每个 ...

  6. hdu-2169 Computer(树形dp+树的直径)

    题目链接: Computer Time Limit: 1000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  7. super.onCreate(savedInstanceState) 以及onCreate(Bundle savedInstanceState, PersistableBundle persistentState)

    super.onCreate(savedInstanceState) 调用父类的onCreate构造函数. 当一个Activity在生命周期结束前,会调用onSaveInsanceState()这个回 ...

  8. 1123 Is It a Complete AVL Tree(30 分)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  9. ACM学习历程—Hihocoder 1164 随机斐波那契(数学递推)

    时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). ...

  10. 【Lintcode】382.Triangle Count

    题目: Given an array of integers, how many three numbers can be found in the array, so that we can bui ...