NC20160. [JSOI2008]BLUE MARY的战役地图
描述
输入描述
第一行包含一个正整数n。
以下n行,每行包含n个正整数,表示第一张战役地图的代表矩阵。
再以下n行,每行包含n个正整数,表示第二张战役地图的代表矩阵。
输出描述
仅包含一行。这一行仅有一个正整数,表示这两个矩阵的相似程度。
示例1
输入:
3 1 2 3 4 5 6 7 8 9 5 6 7 8 9 1 2 3 4
输出:
2
说明:
样例解释:
子矩阵: 5 6 8 9 为两个地图的最大公共矩阵
约定:
C++11(clang++ 3.9) 解法, 执行用时: 41ms, 内存消耗: 27020K, 提交时间: 2020-10-07 19:06:10
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=52; int f[N][N][N][N]; int a[N][N],b[N][N]; int n; int ans; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&b[i][j]); for(int x1=1;x1<=n;x1++){ for(int y1=1;y1<=n;y1++){ for(int x2=1;x2<=n;x2++){ for(int y2=1;y2<=n;y2++){ if(a[x1][y1]==b[x2][y2]){ f[x1][y1][x2][y2]=min(f[x1-1][y1-1][x2-1][y2-1],min(f[x1][y1-1][x2][y2-1],f[x1-1][y1][x2-1][y2]))+1; } ans=max(ans,f[x1][y1][x2][y2]); } } } } printf("%d",ans); return 0; }