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

数据范围果断小,果断暴力。。。

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <cmath>
 7 
 8 #define N 14
 9 #define INF 1e9
10 
11 using namespace std;
12 
13 int a,b,n;
14 double sm[N][N],map[N][N],dp[N][N][N][N][N],sum,sumb;
15 
16 inline void read()
17 {
18     scanf("%d%d%d",&a,&b,&n);
19     for(int i=1;i<=a;i++)
20         for(int j=1;j<=b;j++)
21             scanf("%lf",&map[i][j]),sum+=map[i][j];
22     sumb=sum/n;
23     for(int i=1;i<=a;i++)
24         for(int j=1;j<=b;j++)
25             sm[i][j]=sm[i-1][j]+sm[i][j-1]-sm[i-1][j-1]+map[i][j];
26 }
27 
28 inline double dfs(int x1,int y1,int x2,int y2,int cs)
29 {
30     double &res=dp[x1][y1][x2][y2][cs];
31     if(res<INF) return res;
32     if(cs==0)
33     {
34         res=(sm[x2][y2]+sm[x1-1][y1-1]-sm[x1-1][y2]-sm[x2][y1-1])-sumb;
35         res=res*res;
36         return res;
37     }
38     for(int i=x1;i<x2;i++)
39         for(int j=0;j<=cs-1;j++)
40             res=min(res,dfs(x1,y1,i,y2,j)+dfs(i+1,y1,x2,y2,cs-j-1));
41     for(int i=y1;i<y2;i++)
42         for(int j=0;j<=cs-1;j++)
43             res=min(res,dfs(x1,y1,x2,i,j)+dfs(x1,i+1,x2,y2,cs-j-1));
44     return res;
45 }
46 
47 inline void go()
48 {
49     for(int i=0;i<=10;i++)
50         for(int j=0;j<=10;j++)
51             for(int k=0;k<=10;k++)
52                 for(int p=0;p<=10;p++)
53                     for(int q=0;q<=10;q++)
54                         dp[i][j][k][p][q]=INF;
55     dfs(1,1,a,b,n-1);
56     printf("%.2lf\n",sqrt(dp[1][1][a][b][n-1]/n));
57 }
58 
59 int main()
60 {
61     read(),go();
62     return 0;
63 }
原文地址:https://www.cnblogs.com/proverbs/p/2945111.html