hdu 1506的加强版
看了大牛的思路才会做
对每一行做一次1506的算法
不会的看博客hdu 1506
http://blog.csdn.net/talak/article/details/8108137
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int l[1005][1005];
int r[1005][1005];
int num[1005][1005];
int dp[1005][1005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
char knum[3];
scanf("%s",knum);
if(knum[0]=='F')
{
dp[i][j]=dp[i-1][j]+1;
}
else
dp[i][j]=0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
l[i][j]=j,r[i][j]=j;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
while(l[i][j]-1>0&&dp[i][l[i][j]-1]>=dp[i][j])
{
l[i][j]=l[i][l[i][j]-1];
}
}
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
{
while(r[i][j]+1<=m&&dp[i][r[i][j]+1]>=dp[i][j])
{
r[i][j]=r[i][r[i][j]+1];
}
}
int maxn=-1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int num=r[i][j]-l[i][j]+1;
if(num*dp[i][j]*3>maxn)
maxn=num*dp[i][j]*3;
}
}
printf("%d\n",maxn);
}
}