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;
}
标签:int,矩阵,2019,mp,&&,Yinchuan,now,1010
From: https://www.cnblogs.com/ycllz/p/16987996.html