首页 > 代码库 > bzoj 1567 [JSOI2008]Blue Mary的战役地图题解

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

 

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