题目:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1786
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char maps[1005][1005];
int book[1005][1005];
int solve(int wist[], int n)
{
//int hist[6]={3,2,2,0,0};
int* arr = new int[n];// 申请一个额外的数组
arr[0] = hist[0];
int max = hist[0]; // 最大面积
for(int i=1; i<n; i++)
{
arr[i] = hist[i];
for(int j=i-1; j>=0; j--)
{
if(arr[j]>arr[i])
{
if(arr[j]*(i-j)>max)
{
max = arr[j]*(i-j);
}
arr[j] = arr[i];
}
else break;
//数组arr里的元素,保持非递减的顺序。
printf("%d ",arr[j]);
}
}
/*for(int i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
printf("%d ",max);*/
//重新扫描一边,以更新最大面积
for(int i=0; i<n; i++)
{
if(arr[i]*(n-i)>max)
{
max = arr[i]*(n-i);
}
}
//printf("%d \n",max);
return max;
}
int main()
{
//freopen("B.in.txt","r",stdin);
//freopen("B.out.txt","w",stdout);
int t;
scanf("%d",&t);
while(t--)
{
memset(book,0,sizeof(book));
int n,m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
getchar();
scanf("%c",&maps[i][j]);
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(i==0)
{
if(maps[i][j]=='F')
book[i][j]=1;
}
else
{
if(book[i-1][j]!=0&&maps[i][j]=='F')
{
book[i][j]=book[i-1][j]+1;
}
else if(book[i-1][j]==0&&maps[i][j]=='F')
{
book[i][j]=1;
}
}
}
}
int ans=0;
for(int i=0; i<n; i++)
{
ans=max(ans,solve(book[i],m));
}
printf("%d\n",ans);
}
}
当个模板题吧。