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

 

你可能感兴趣的:(2008)