2018.09.29 bzoj3039: 玉蟾宫(悬线法)

传送门
悬线法的板子题。


悬线法只需要保存当期点向下最多多少个,把这个当成一条线,再处理出线绷直之后最多能向左右延展多少就行了。
代码:

#include
#define N 1005
using namespace std;
int n,m,a[N][N],L[N][N],R[N][N],h[N][N],ans=0;
char s[3];
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
		scanf("%s",s),h[i][j]=1,L[i][j]=R[i][j]=j;
		if(s[0]=='F')a[i][j]=1;
	}
	for(int i=1;i<=n;++i)for(int j=2;j<=m;++j)if(a[i][j]&a[i][j-1])L[i][j]=L[i][j-1];
	for(int i=1;i<=n;++i)for(int j=m-1;j;--j)if(a[i][j]&a[i][j+1])R[i][j]=R[i][j+1];
	for(int i=1;i<=n;++i)for(int j=1;j<=m;++j){
		if((i^1)&&(a[i][j]&a[i-1][j])){
			L[i][j]=max(L[i][j],L[i-1][j]),R[i][j]=min(R[i][j],R[i-1][j]);
			h[i][j]=h[i-1][j]+1;
		}
		ans=max(ans,a[i][j]*(R[i][j]-L[i][j]+1)*h[i][j]);
	}
	printf("%d",ans*3);
	return 0;
}

你可能感兴趣的:(#,悬线法)