洛谷4147
悬线法左右推,推出面积最大
这里有一篇好的博文有助理解 https://blog.csdn.net/twtsa/article/details/8120269
#include<cstdio> #include<iostream> #include<algorithm> #define maxn 1003 using namespace std; int n,m,a[maxn][maxn],l[maxn][maxn],r[maxn][maxn],L[maxn][maxn],R[maxn][maxn],hi[maxn][maxn]; int main(){ int ans=0,t; scanf("%d%d",&n,&m); char ch; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ cin>>ch; if(ch=='F')a[i][j]=1; } for(int i=1;i<=n;i++){ t=0; for(int j=1;j<=m;j++) if(a[i][j])l[i][j]=t; else t=j; t=m+1; for(int j=m;j>=1;j--) if(a[i][j])r[i][j]=t; else{R[i][j]=m+1;t=j;} } for(int i=1;i<=m;i++) R[0][i]=m+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]){ hi[i][j]=hi[i-1][j]+1; L[i][j]=max(l[i][j]+1,L[i-1][j]); R[i][j]=min(r[i][j]-1,R[i-1][j]); ans=max(ans,(R[i][j]-L[i][j]+1)*hi[i][j]); } printf("%d",3*ans); return 0; }