City Game
题意:在一个由”R”、”F”组成的大矩阵中求出一个最大的全是”F”的最大子矩阵。
分析:对于这个题目,我们可以参照HDU 1506,类型相同,只需转换一下就可以做。对于每一行,我们求出每一个元素向上可以达到的最大高度( 即 HDU 1506 中的柱形的高度),这样就转化成m组柱形,对每一组都去求出最大的子矩阵即可。
TIPS:答案是“m组中最大的矩阵 * 3”;
代码如下:
#include <algorithm>
#include <bitset>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <string>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
#define MAXN 1005
int a[MAXN][MAXN],L[MAXN][MAXN],R[MAXN][MAXN];
int main(){
int ans,temp,T,m,n;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
char s[5];
scanf("%s",s);
if(s[0]=='F')
a[i][j]=a[i-1][j]+1;//当前向上的最大连续高度
else
a[i][j]=0;
}
}
/* for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}*/
ans=0;
for(int i=1;i<=m;i++){
L[i][1]=1;
for(int j=2;j<=n;j++){
int k=j;
while(k>1&&a[i][j]<=a[i][k-1])k=L[i][k-1];
L[i][j]=k;
}
R[i][n]=n;
for(int j=n-1;j>=1;j--){
int k=j;
while(k<n&&a[i][j]<=a[i][k+1])k=R[i][k+1];
R[i][j]=k;
}
temp=0;
for(int j=1;j<=n;j++){
if( temp < a[i][j]*(R[i][j]-L[i][j]+1) ){
temp = a[i][j]*(R[i][j]-L[i][j]+1);
}
}
if(ans<temp)ans=temp;
}
printf("%d\n",ans*3);
}
return 0;
}
JNU-ACM-ICPC
WYC