hduoj_1505(dp)

我看了题解之后写的很快。

但是却花费了一下午的时间改错。


算法的主要流程没有问题,竟然是错在了数据的读取上。

注释部分是我的写法,这么写测试大部分用例都成功了,但是WA。

改用cin后AC。

不知道原因是什么。


下面这个博主和我的经历类似。

https://blog.csdn.net/Ice_Crazy/article/details/7545662


下面是AC代码。

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

int map[1001][1001];
int r[1001];
int l[1001];

int main()
{
	int K;
	int a, b;
	int i, j;
	int max;
	char c;
	scanf("%d", &K);
	while (K--)
	{
		scanf("%d %d", &a, &b);
		memset(map, 0, sizeof(map));
		getchar();
		for (i = 1; i <= a; i++)
		{
			for (j = 1; j <= b; j++)
			{
				/* wa
				scanf("%c", &c);
				getchar();
				*/
				cin >> c;
				if ('F' == c)
					map[i][j] = 1;
			}	
		}

		// 累加
		for (i = 2; i <= a; i++)
		{
			for (j = 1; j <= b; j++)
			{
				if (map[i][j])
					map[i][j] = map[i - 1][j] + 1;
			}
		}

		// 下面的过程和 hduoj 1505 一样了
		// 遍历每一行
		max = -1;
		for (i = 1; i <= a; i++)
		{
			
			for (j = 1; j <= b; j++)
				l[j] = r[j] = j;

			// 向左
			for (j = 2; j <= b; j++)
			{
				while (l[j] - 1 > 0 && map[i][j] <= map[i][l[j] - 1])
					l[j] = l[l[j] - 1];
 			}

			// 向右
			for (j = b - 1; j >= 1; j--)
			{
				while (r[j] < b && map[i][j] <= map[i][r[j] + 1])
					r[j] = r[r[j] + 1];
			}

			for (j = 1; j <= b; j++)
				max = max > (map[i][j] * (r[j] - l[j] + 1)) ? max : (map[i][j] * (r[j] - l[j] + 1));
		}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值