题意:给两个N*M的矩阵,矩阵的元素为1~N*M的全排列,求两个矩阵的最大相同子矩形的面积(元素数)。N M范围1000
这种求最大相同子矩形的题目很容易想到使用单调栈来解决。首先给出的两个矩阵元素为均为排列,即每个数字都只出现一次。那么A矩阵的每个数字都在B矩阵有一个唯一的对应位置。我们可以先建立一个pos数组来求出A矩阵中每个数字在B矩阵中的对应位置。
那么对于A矩阵的每个数字,我们可以算出从这个数字往右一直可以匹配多少个B矩阵的数字,即对于每个数字,都往右匹配出一个尽量长的1*x的子矩阵。
现在对于每一列从上往下看,每个数字能匹配到最右边的端点已知,那么这就变成了经典的求柱形图最大面积的题目了。(POJ2559)
然后单调栈爆搞就完事啦~
但是要注意这种情况
A矩阵为
1 2 3
4 5 6
B矩阵为
2 3 1
4 5 6
对于A矩阵的2和5,最右匹配长度都为2,但是对应B矩阵的2 5的列位置却不相同,不能直接像求最大柱形图那样做。需要先判断合法,如果不合法的话,清空之前的栈,再从下一位置开始push。(具体看注释吧QAQ)
之前从来没写过单调栈的题(连POJ2559那个模板题都没写过),光知道有这么个东西,不过现场随便推了推就轻松过啦~
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define fi first
#define se second
#define mp make_pair
#define rep(i,a,b) for(int i = a; i <