[JSOI2008]Blue Mary的战役地图

暴力水过系列

数据范围这么小,就打暴力吧

枚举最大公共子矩阵的边长O(n)

枚举两个最大公共子矩阵的左上角O(n^4)

判断是否相同O(n^2)

总复杂度O(n^7),显然过不了

过不了怎么办,删冗余枚举啊

一堆优化:

1,倒序枚举边长,一旦满足,即为答案

2,判断是否相同,一旦不同,跳出去

然后就过了

#include<iostream>
#include<cstdio>
using namespace std;
int a[2][60][60],n,ans;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<2;i++)
        for(int j=1;j<=n;j++)
            for(int k=1;k<=n;k++)
                scanf("%d",&a[i][j][k]);
    for(int l=n;l>=1;l--)
        for(int x1=1;x1<=n-l+1;x1++)
            for(int y1=1;y1<=n-l+1;y1++)
                for(int x2=1;x2<=n-l+1;x2++)
                    for(int y2=1;y2<=n-l+1;y2++)
                    {
                        bool p=0;
                        for(int x=0;x<l;x++)
                        {
                            for(int y=0;y<l;y++)
                            {
                                if(a[0][x1+x][y1+y]!=a[1][x2+x][y2+y])
                                    p=1;
                                if(p)
                                    break;
                            }
                            if(p)
                                break;
                        }
                        if(!p)
                        {
                            printf("%d
",l);
                            return 0;
                        }
                    }
    return 0;
}
原文地址:https://www.cnblogs.com/ivanovcraft/p/9737561.html