1048: [HAOI2007]分割矩阵——记忆化搜索
2015-05-28 19:07
197 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=1048
TML了一发
TML了一发
[code]#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #define clr(a,b) memset(a,b,sizeof(a)) const double INF = 0x3f3f3f3f; using namespace std; int a[11][11]; int sum[11][11],sumx[11][11],sumy[11][11]; double dp[11][11][11][11][11]; int n,m,k; double ave; double solve(int x1,int y1,int x2,int y2,int k) { double &ans=dp[x1][y1][x2][y2][k]; if(ans>=0.0) return ans; if(k==1){ int t=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1]; return ans=(t-ave)*(t-ave); } ans=INF; for(int i=y1;i<y2;++i){ for(int j=1;j<k;++j){ ans=min(ans,solve(x1,y1,x2,i,j)+solve(x1,i+1,x2,y2,k-j)); } } for(int i=x1;i<x2;++i){ for(int j=1;j<k;++j){ ans=min(ans,solve(x1,y1,i,y2,j)+solve(i+1,y1,x2,y2,k-j)); } } return ans; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // ONLINE_JUDGE scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ scanf("%d",&a[i][j]); sumx[i][j]=sumx[i][j-1]+a[i][j]; sumy[j][i]=sumy[j][i-1]+a[i][j]; } } for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ sum[i][j]=sum[i-1][j-1]+sumx[i][j-1]+sumy[j][i-1]+a[i][j]; } } ave=sum [m]*1.0/k; clr(dp,0xff); double ans=solve(1,1,n,m,k); printf("%.2f\n",sqrt(ans/k)); return 0; }
相关文章推荐
- P102
- 如何开发一个java开源框架-----Jvn框架之实现文件的上传以及方法封装(第六讲)八哥实力讲解
- Android 4.4 Graphic系统详解(2) VSYNC的生成
- 概率dp ZOJ 3329
- int、bigint、smallint 和 tinyint范围
- JAVA用栈求解(简单的)背包问题
- srm 528
- hightcharts json数据传递(特别是饼图)
- 主成分分析法原理及其python实现
- Centos解决ppp: compressor dropped pkt
- OC视频笔记13(点语法的调用,给属性赋值时属性与参数名子相同的结果)14(练习)
- Leetcode 3 Longest Substring Without Repeating Characters
- Python ZKPython 安装
- HTTP网络启动安装原版系统ISO镜像
- Clone Graph -- leetcode
- yahoo mysql性能监控工具使用
- ORA-01410 invalid rowid
- Spring MVC 教程,快速入门,深入分析(转)
- 携程网被黑,谁干的??
- linux异步通知机制 与 fcntl 函数使用详解