poj1191(記憶化搜索)
題目鏈接: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(記憶化搜索)的更多相关文章
- poj1088(記憶化搜索)
題目鏈接:http://poj.org/problem?id=1088 題意:中文題誒- 思路:dfs,不過直接dfs因該會超時,那我們給他加個記錄路徑就好了... 代碼: #include < ...
- poj1191 棋盘分割【区间DP】【记忆化搜索】
棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16263 Accepted: 5812 Description ...
- Linux Kernel 記憶體管理機制之美<转>
转自--http://five.rdaili.com/sohu.com.php?u=Mq3EniVnae0axim7jkGhH0IhA9uho6CQso7R1aYomXWJ9UemfwUQYmKRc8 ...
- bzoj1079--记忆化搜索
题目大意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得 ...
- bzoj3208--记忆化搜索
题目大意: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目. 我们可以把风景区看作一个n*n的地图,每个点有它的初始高度,滑雪只能从高处往低处滑[严格大于] ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- ACM/ICPC 之 简单DP-记忆化搜索与递推(POJ1088-滑雪)
递推型DP 将每个滑雪点都看作起点,从最低点开始逐个由四周递推出到达此点的最长路径的长度,由该点记下. 理论上,也可以将每一点都看作终点,由最高点开始计数,有兴趣可以试试. //经典DP-由高向低海拔 ...
随机推荐
- Redis之java增删改查
jedis是java的redis客户端实现,要使用jedis须要加入jedis的maven依赖: <dependency> <groupId>redis.clients< ...
- 关于jquery-weui.js中时间控件datetimepicker的使用
今天第一次接触jquery-weui,不太了解用法,然而官方文档写的也很简略,只好打开源代码进行研究,我想要的是设置开始日期大于当前日期,然后在源码中发现有min这个默认为undefined的属性,于 ...
- Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- SpringCloud与Dubbo区别
为什么放弃Dubbo 使用SpringCloud? 相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理. 不同点: SpringCloud是一套目前比较网站微服务 ...
- Ubuntu 17.4下如何安装VMwareTools
解压vmware-tools-distrib 运行vmware-install.pl安装过程中间出现错误,要求选择"ifconfig"工具.由于ifconfig工具过时逐渐被各大厂 ...
- 在node.js中建立你的第一个HTTp服务器
这一章节我们将从初学者的角度介绍如何建立一个简单的node.js HTTP 服务器 创建myFirstHTTPServer.js //Lets require/import the HTTP modu ...
- OpenCV——PS滤镜 漩涡 vertex
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...
- POJ3417Network(LCA+树上查分||树剖+线段树)
Yixght is a manager of the company called SzqNetwork(SN). Now she's very worried because she has jus ...
- ACM学习历程—NPU1045 2015年陕西省程序设计竞赛网络预赛(热身赛)C题 Graph Theory(递推 && 组合数学 && 大数)
Description In graph theory, a matching or independent edge set in a graph G = (V , E) is a set of e ...
- hibernate学习五 Hibernate补充
1 MiddleGenIDE可以生成映射类和映射文件. 2