HDU 1505 City Game【DP】

题意:是二维的1506,即在1506的基础上,再加一个for循环,即从第一行到最后一行再扫一遍---


自己写的时候,输入的方法不对---发现输不出结果,后来看了别人的----@_@
发现是将字母和空格当成一个字符串来输入的。

#include<iostream>  

#include<cstdio>  

#include<cstring>  

#include<algorithm>  

using namespace std;

int h[1010][1010],l[1010],r[1010];

char c[105];

int main()

{

	int ncase,n,m,i,j,ans,tmp;

	char ch;

	scanf("%d",&ncase);

	while(ncase--)

	{

		ans=0;

		scanf("%d %d",&m,&n);

		for(i=1;i<=m;i++)

		{

			for(j=1;j<=n;j++)

			{

				scanf("%s",c);//输入是将字母和空格当成了一个字符串 

				if(c[0]=='F') h[i][j]=h[i-1][j]+1;

				else h[i][j]=0;		

			}

		}

		

		for(i=1;i<=m;i++)

		{

			h[i][0]=-1;h[i][n+1]=-10000;//边界的值可以规定为任意负数 

			for(j=1;j<=n;j++)

			l[j]=r[j]=j;			

			for(j=2;j<=n;j++)

			{

				while(h[i][l[j]-1]>=h[i][l[j]])

				l[j]=l[l[j]-1];

			}

			for(j=n-1;j>=1;j--)

			{

				while(h[i][r[j]+1]>=h[i][r[j]])

				r[j]=r[r[j]+1];

			}

			for(j=1;j<=n;j++)

			{

				tmp=h[i][j]*(r[j]-l[j]+1);

				if(tmp>ans) ans=tmp;

			}

		}

		printf("%d\n",ans*3);		

	}

}

  

你可能感兴趣的:(game)