题解
- 对于一个矩阵为酷只为它的每一个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 }