hduoj_1505(dp)

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

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


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

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

改用cin后AC。

不知道原因是什么。


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

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


下面是AC代码。

#include 
#include 
#include 

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;
}

你可能感兴趣的:(算法)