hdu 1505-左右界数组

题目链接:点击打开链接

题解:跟hdu 1506基本相同,只是要多加一个循环用二维的。

代码:
#include
#include
#include
#include
using namespace std;
typedef long long ll; 
const int mx=1e3+10;
int n,m,fron[mx],back[mx],r[mx][mx];
char map[mx][mx];
void get_rc(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(map[i][j]=='F') r[i][j] = r[i-1][j]+1;
			else r[i][j]=0;
		}
	}
}
int main(){
	int t;
	scanf("%d",&t); 
	while(t--){
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		cin>>map[i][j];
		ll ans=0;
		get_rc();
		back[m+1]=m+1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				int t=j-1;
				while(t&&r[i][t]>=r[i][j]) t = fron[t];  
                fron[j]=t; 
			}
			for(int j=m;j>=1;j--){  
                int t = j+1;  
                while(t!=m+1&&r[i][t]>=r[i][j]) t = back[t];   
                back[j]=t; 
		    }
		    for(int j=1;j<=m;j++)  ans=max(ans,1ll*r[i][j]*(back[j]-fron[j]-1));  
	    }
	    printf("%lld\n",ans*3);
	}
    return 0;
}


你可能感兴趣的:(思维题)