[单调栈] Jzoj P4260 最大子矩阵
题解
- 对于一个矩阵为酷只为它的每一个2*2的矩阵都是酷的
- 那么可以考虑求出每一个2*2的矩阵是否酷,把酷的矩阵染为颜色1,不酷的矩阵不染色
- 那么现在问题就转换为求一个含有最大面积的长方形(含1)
- 用单调栈解决就好了
代码
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 int r,s,a[1010][1010],k[1010][1010],cnt,w[1010],ans; 6 int main() 7 { 8 scanf("%d%d",&r,&s); 9 for (int i=1;i<=r;i++) 10 for (int j=1;j<=s;j++) 11 scanf("%d",&a[i][j]),k[i][j]=1; 12 for (int j=2;j<=s;j++) 13 for (int i=2;i<=r;i++) 14 if (a[i][j]+a[i-1][j-1]<=a[i-1][j]+a[i][j-1]) k[i][j]=k[i-1][j]+1; 15 for (int i=1;i<=r;i++) 16 for (int j=1;j<=s;j++) 17 if (k[i][j]==1) k[i][j]=0; 18 w[0]=1; 19 for (int i=2;i<=r;i++) 20 { 21 cnt=0; 22 for (int j=2;j<=s;j++) 23 { 24 while (cnt&&k[i][j]<=k[i][w[cnt]]) 25 { 26 ans=max(ans,k[i][w[cnt]]*(j-w[cnt-1])); 27 cnt--; 28 } 29 w[++cnt]=j; 30 } 31 while (cnt) 32 { 33 ans=max(ans,k[i][w[cnt]]*(s+1-w[cnt-1])); 34 cnt--; 35 } 36 } 37 printf("%d",ans); 38 return 0; 39 }