HDU 1505

首先,此题在输入地图时, R 与 F 之间并不一定是一个空格

因此 采用下面的代码输入,会导致wa,尽管你怎么测试都是对的。

		scanf("%d%d",&n,&m);
		getchar();
		for(i = 1; i <= n; i++)
		{
			for(j = 1; j <= m; j++)
			{
				scanf("%c%*c",&a);
				if(a == 'F') map[i][j] = map[i - 1][j] + 1;
				else map[i][j] = 0;	
			}
			
		}

正确的方式是使用 scanf("%s",a); 

		getchar();
		for(i = 1; i <= n; i++)
		{
			for(j = 1; j <= m; j++)
			{
				scanf("%s",a);
				if(a[0] == 'F') map[i][j] = map[i - 1][j] + 1;
				else map[i][j] = 0;	
			}
			
		}


然后,关于具体做法:

首先对整个地图进行标号,如下

                                                   0 1 1 1 1 1
                                                        1 2 2 2 2 2
                                                   0 0 0 3 3 3
                                                     1 1 1 4 4 4
                                                         2 2 2 5 5 5
每个数字表示该位置到顶端的长度,若有R,则记为0,并作为一个顶端。
在学会hdu 1506的扩展方法后,应用于此。1506百度解题报告都有详细的讲解。

一行一行的加入。首先求第一行每个点在  只有一行  的情况下,分别求得所能扩展得到的最大点数。(此处的“扩展”就是hdu1506的方法)
如上例中,第一行第二个,能得到的最大点数就是 1 × 5  = 5
然后加入第二行,求第二行每个点在  有两行  的情况下,分别求得所能扩展得到的最大点数。
一行一行下去,并不断比较最大值,并保存。最后输出最大值。
#include<string.h>
#include<iostream>
#include<algorithm>	
#include<stdlib.h>
#include<cstdio>
#include<cmath>
using namespace std;
int map[1005][1005];
int main()
{
//	freopen("t.txt","r",stdin);
	char a[10];
	int l[1005],r[1005];
	int t,m,n,u,s,maxx,i,j;
	scanf("%d",&t);
	while(t--)
	{
		maxx = 0;
		memset(map,0,sizeof(map));
		scanf("%d%d",&n,&m);
		getchar();
		for(i = 1; i <= n; i++)
		{
			for(j = 1; j <= m; j++)
			{
				scanf("%s",a);
				if(a[0] == 'F') map[i][j] = map[i - 1][j] + 1;
				else map[i][j] = 0;	
			}
			
		}
		for(i = 1; i <= n; i++)
		{
			map[i][0] = map[i][m+1] = 0;
			for(j = 1; j <= m; j++)
			{
				u = j;
				while(map[i][j] <= map[i][u - 1] && u > 1) u = l[u - 1];
				l[j] = u;
			}
			for(j = m; j >= 1; j--)
			{
				u = j;
				while(map[i][j] <= map[i][u + 1] && u < m) u = r[u + 1];
				r[j] = u; 
			}
			for(j = 1; j <= m; j++)
			{
				s = (r[j] - l[j] + 1) * map[i][j];
				maxx = max(maxx,s);
			}
		}
		printf("%d\n",3*maxx);
			
		
	}
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值