bzoj 1567 [JSOI2008]Blue Mary的战役地图题解

此题时限10秒,顿时惊呆,想到一个n^5解法,果断去写。

用f[i1][j1][i2][j2]表示从a矩阵的(i1,j1)和b矩阵的(i2,j2)开始哪一行有多少相同的。

然后再枚举i1,i2,j1,j2然后判断有几行。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n;
 5 int ans=0;
 6 long long a[60][60],b[60][60];
 7 int f[60][60][60][60];
 8 int main()
 9 {
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++)
12     {
13         for(int j=1;j<=n;j++)
14         scanf("%lld",&a[i][j]);
15     }
16     for(int i=1;i<=n;i++)
17     {
18         for(int j=1;j<=n;j++)
19         scanf("%lld",&b[i][j]);
20     }
21     for(int i1=1;i1<=n;i1++)
22     {
23         for(int j1=1;j1<=n;j1++)
24         {
25             for(int i2=1;i2<=n;i2++)
26             {
27                 for(int j2=1;j2<=n;j2++)
28                 {
29                     int t=0;
30                     while(t+j1<=n && t+j2<=n && a[i1][j1+t]==b[i2][j2+t])t++;
31                     if(t<0)t=0;
32                     f[i1][j1][i2][j2]=t;
33                 }
34             }
35         }
36     }
37     for(int i1=1;i1<=n;i1++)
38     {
39         for(int j1=1;j1<=n;j1++)
40         {
41             for(int i2=1;i2<=n;i2++)
42             {
43                 for(int j2=1;j2<=n;j2++)
44                 {
45                     int now=f[i1][j1][i2][j2];
46                     if(now==0)continue;
47                     int t=1;
48                     if(ans==0)ans=1;
49                     while(now && t+i1<=n && t+i2<=n)
50                     {
51                         if(f[i1+t][j1][i2+t][j2]<now)now=f[i1+t][j1][i2+t][j2];
52                         ans=max(ans,min(t+1,now));
53                         t++;
54                     }
55                 }
56             }
57         }
58     }
59     printf("%d\n",ans);
60     return 0;
61 }
62             
View Code

 

posted @ 2014-09-01 22:07  溪桥,吾愿  阅读(281)  评论(0编辑  收藏  举报