列表

详情


NC20160. [JSOI2008]BLUE MARY的战役地图

描述

Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏。她正在设法寻找更多的战役地图以进一步提高自己的水平。 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打法能够通过的战役地图,她只需要玩一张,她就能了解这一类战役的打法,然后她就没有兴趣再玩儿这一类地图了。而网上流传的地图有很多都是属于同一种打法,因此Blue Mary需要你写一个程序,来帮助她判断哪些地图是属于同一类的。 
具体来说,Blue Mary已经将战役地图编码为n*n的矩阵,矩阵的每个格子里面是一个32位(有符号)正整数。对于两个矩阵,他们的相似程度定义为他们的最大公共正方形矩阵的边长。两个矩阵的相似程度越大,这两张战役地图就越有可能是属于同一类的。

输入描述

第一行包含一个正整数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 为两个地图的最大公共矩阵

约定: n\le 50

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

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;
}

上一题