暴力水过系列
数据范围这么小,就打暴力吧
枚举最大公共子矩阵的边长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\n",l); ???????????????????????????return 0; ???????????????????????} ???????????????????} ???return 0;}
[JSOI2008]Blue Mary的战役地图
原文地址:https://www.cnblogs.com/ivanovcraft/p/9737561.html