2019 Yinchuan K

K. Largest Common Submatrix

题链
其实这类题就是非常典
因为他给出的是一个不重复的矩阵
那么我们B都会对应A有且仅有一个位置
我们抽象其B->A为一个特定的向量
题意就转化为求B中同向量的最大子矩阵
求最大子矩阵显然可以用悬线法
我们枚举每一行 然后悬线法即可
我们只需要思考转移
比如我们现在要从第i-1行转移到第i行
显然我们该位置上的对应A只要是上面一个位置对应A的下方一个就是可以继承的 否则就直接为1
左右扩展的也是如此

int a[1010][1010],b[1010][1010];
void solve(){
    vector<int>mp(N);
    int n,m;cin>>n>>m;
    int now=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            mp[a[i][j]]=now;
            now++;
        }
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>b[i][j];
    vector<int>l(N),r(N),A(N);
    int ans=0;
    for(int i=1;i<=n;i++){
        for (int j = 1; j <= m; j++){
            if(mp[b[i-1][j]]+m==mp[b[i][j]])A[j]++;
            else A[j]=1;
        }
        for (int j = 1; j <= m; j++) {
            l[j]=j;
            while (l[j] > 1 && mp[b[i][l[j] - 1]] - mp[b[i][j]] == l[j] - 1 - j && A[j] <= A[l[j] - 1])
                l[j] = l[l[j] - 1];
        }
        for (int j = m; j >= 1; j--) {
            r[j]=j;
            while (r[j] < m && mp[b[i][r[j] + 1]] - mp[b[i][j]] == r[j] + 1 - j && A[j] <= A[r[j] + 1])
                r[j] = r[r[j] + 1];
        }
        for (int j = 1; j <= m; j++)
            ans = max(ans, (r[j] - l[j] + 1) * A[j]);
    }
    cout<<ans<<endl;
}
posted @ 2022-12-16 17:43  ycllz  阅读(35)  评论(0)    收藏  举报