您的位置:首页 > 其它

BZOJ 1048 [HAOI2007]分割矩阵 记忆化搜索

2013-03-05 21:34 211 查看
数据范围果断小,果断暴力。。。

View Code

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>

#define N 14
#define INF 1e9

using namespace std;

int a,b,n;
double sm

,map

,dp

,sum,sumb;

inline void read()
{
scanf("%d%d%d",&a,&b,&n);
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
scanf("%lf",&map[i][j]),sum+=map[i][j];
sumb=sum/n;
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
sm[i][j]=sm[i-1][j]+sm[i][j-1]-sm[i-1][j-1]+map[i][j];
}

inline double dfs(int x1,int y1,int x2,int y2,int cs)
{
double &res=dp[x1][y1][x2][y2][cs];
if(res<INF) return res;
if(cs==0)
{
res=(sm[x2][y2]+sm[x1-1][y1-1]-sm[x1-1][y2]-sm[x2][y1-1])-sumb;
res=res*res;
return res;
}
for(int i=x1;i<x2;i++)
for(int j=0;j<=cs-1;j++)
res=min(res,dfs(x1,y1,i,y2,j)+dfs(i+1,y1,x2,y2,cs-j-1));
for(int i=y1;i<y2;i++)
for(int j=0;j<=cs-1;j++)
res=min(res,dfs(x1,y1,x2,i,j)+dfs(x1,i+1,x2,y2,cs-j-1));
return res;
}

inline void go()
{
for(int i=0;i<=10;i++)
for(int j=0;j<=10;j++)
for(int k=0;k<=10;k++)
for(int p=0;p<=10;p++)
for(int q=0;q<=10;q++)
dp[i][j][k][p][q]=INF;
dfs(1,1,a,b,n-1);
printf("%.2lf\n",sqrt(dp[1][1][a][b][n-1]/n));
}

int main()
{
read(),go();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: