棋盘分割[NOI 1999][Codevs 1711]
2016-06-25 16:46
337 查看
题目描述 Description
将一个8∗8 的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了 (n−1) 次后,连同最后剩 下的矩形棋盘共有 n 块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成 n 块矩形棋盘,并使各矩形棋盘总分的均方差最小。
请编程对给出的棋盘及 n ,求出方差的最小值。
输入描述 Input Description
第 1 行为一个整数 n(1<n<15) 。第 2 行至第 9 行每行为 8 个小于 100 的非负整数,表示棋盘上相应格子的分值。每行相邻两数之间用一个空格分隔。
输出描述 Output Description
仅一个数,为方差(四舍五入精确到小数点后三位)样例输入 Sample Input
31 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数据范围及提示 Data Size & Hint
若 x1,x2,x3......xn 的平均数为 m则方差 s2=1/n[(x1−m)2+(x2−m)2+.......+(xn−m)2]
方差即偏离平方的均值,称为标准差或均方差,方差描述波动程度。
分析 I Think
s2=1n∑i=1n(xi−x¯)2=1n∑i=1n(x2i−2∗xi∗x¯+x¯)2=1n∑i=1nx2i−x¯∗∑i=1nxi+x¯2=1n∑i=1nx2i−x¯2因为 x¯ 是一个定值。,所以我们只要求出 ∑ni=1x2i 的最小值即可。可以用记忆化搜索来完成
代码 Code
#include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int f[20][10][10][10][10]; int s[10][10][10][10]; int n; int w[10][10]; int dfs(int,int,int,int,int); int main(){ scanf("%d",&n); for(int i=1;i<=8;++i) for(int j=1;j<=8;++j){ scanf("%d",&w[i][j]); s[i][j][i][j] = w[i][j]; } for(int a=1;a<=8;++a) for(int b=1;b<=8;++b) for(int c=a;c<=8;++c) for(int d=b;d<=8;++d){ for(int e=a;e<=c;++e) for(int f=b;f<=d;++f) s[a][b][c][d] += w[e][f]; f[0][a][b][c][d] = s[a][b][c][d]*s[a][b][c][d]; } printf("%.3lf",sqrt((double)(dfs(1,1,1,8,8)-(double)(s[1][1][8][8]*s[1][1][8][8])/(double)n)/(double)n)); return 0; } int dfs(int x,int a,int b,int c,int d){ if(x == n) return f[0][a][b][c][d]; if(f[x][a][b][c][d]) return f[x][a][b][c][d]; int ans = 0x3f3f3f3f; for(int i=a+1;i<=c;++i) ans = min(ans,min(f[0][a][b][i-1][d]+dfs(x+1,i,b,c,d),f[0][i][b][c][d]+dfs(x+1,a,b,i-1,d))); for(int i=b+1;i<=d;++i) ans = min(ans,min(f[0][a][b][c][i-1]+dfs(x+1,a,i,c,d),f[0][a][i][c][d]+dfs(x+1,a,b,c,i-1))); return f[x][a][b][c][d] = ans; }
相关文章推荐
- jsoncpp初探
- jsoncpp初探
- springboot-aop访问拦截
- 类——类的复用(组合、继承、代理)
- 设计模式之原型模式
- Anroid Touch 事件传递机制
- JavaScript学习笔记十一:高阶函数-map/reduce
- Twitter分布式自增ID算法Snowflake
- 自定义加载等待动画,仿金山词霸
- java基础(三)方法/数组/堆栈/
- WebSocket
- vim设置文本宽度
- sqlite3的图片的(二进制数据)存取操作
- Caused by: java.lang.ClassNotFoundException: Didn't find class "net.oschina.app.AppContext" on path:
- 演练:使用 Visual C# 从 Windows 窗体控件继承
- 线性代数个人系统总结(摘抄,来源多,侵删)
- 焦点图的实现
- 面向对象的特征有哪些方面
- 网站后端.Flask.实战-社交博客开发-认证实现?
- FPGA与simulink联合实时环路系列——实验一 测试