题解:P7958 [COCI2014-2015#6] NEO
解法很简单:先跑出来满足 YF 条件的
来论证两个东西:全为 1 的矩阵为什么是 Sept 矩阵以及怎么求最大值。
那么第一个,我们不妨以一个
这个就是满足 YF 的
同理也可以推广到更大的矩阵。
第一个证毕。
至于第二个,求解本类
随着枚举到第
以及
这分别意味着这条悬线可以向左或向右“推广到”的距离。
同时,可以认为
至于计算过程,以
若
则可以有
这是因为由上面的条件可以知道:至少一直到
对于
如此,对于一个
注意到我们是在缩水过的
代码很简单。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m,a[N][N],ans;
int h[N],l[N],r[N];
bool cd[N][N];
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
--n,--m;
for(int i=1;i<=n;++i) for(int j=1;j<=m;++j)
cd[i][j]=(a[i][j]+a[i+1][j+1]<=a[i][j+1]+a[i+1][j]);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)
l[j]=r[j]=j,h[j]=(cd[i][j])?h[j]+1:0;
for(int j=1;j<=m;++j)
while(l[j]!=1&&h[l[j]-1]>=h[j]) l[j]=l[l[j]-1];
for(int j=m;j>=1;--j)
while(r[j]!=m&&h[r[j]+1]>=h[j]) r[j]=r[r[j]+1];
for(int j=1;j<=m;++j)
ans=max(ans,(r[j]-l[j]+2)*(h[j]+1));
}
cout<<ans<<endl;
return 0;
}