HDU1505 City Game (DP,HDU1506加强版)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1505

没做过1506的建议先去做1506,我有详细解释

1506链接:http://blog.csdn.net/xtttgo/article/details/48085707

因为我是用1506的方法做的这题

题意:R是障碍物,求最大的F形成的矩形

实际上,我们把R的情况去掉,就是跟1506差不多的图形了

比如,题目样例

5 6
R F F F F F
F F F F F F
R R R F F F
F F F F F F
F F F F F F

化简成

5 6

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

如果上面一个是F,就长度+1,如果上一个是R,就为0,然后每一行都进行dp,求出每一行作为矩形的底边能形成的最大矩形面积


代码:

#include<iostream>  
#include<cstring>  
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<map>
#include<stack>
#include<algorithm>
using namespace std;
int a[1011][1011];
int l[1010], r[1010];
int main()
{
//	freopen("D://input.txt", "r", stdin);
//	freopen("D://output.txt", "w", stdout);
	int T;
	scanf("%d", &T);
	while (T--)
	{
		int n, m;
		scanf("%d%d", &n, &m);
		memset(a, 0, sizeof(a));
		int i, j, k;
		for (i = 1; i <= n; i++)
		{
			for (j = 1; j <= m; j++)
			{
				char ch[2];
				scanf("%s", ch);
				if (ch[0] == 'R')
					a[i][j] = 0;
				else
					a[i][j] = a[i - 1][j] + 1;
			}
		}
		int ans = 0, h;
		for (h = 1; h <= n; h++)
		{
			for (j = 0; j <= m + 1; j++)
			{
				l[j] = r[j] = 1;
			}
			for (i = 2; i <= m; i++)
			{
				if (a[h][i] == 0)
					continue;
				j = i;
				while (j > 1 && a[h][j - 1] >= a[h][i])
				{
					l[i] += l[j - 1];
					j = i - l[i] + 1;
				}
			}
			ans = max(ans, a[h][m] * l[m]);
			for (i = m - 1; i >= 1; i--)
			{
				if (a[h][i] == 0)
					continue;
				j = i;
				while (j < n&&a[h][j + 1] >= a[h][i])
				{
					r[i] += r[j + 1];
					j = i + r[i] - 1;
				}
				ans = max(ans, a[h][i] * (l[i] + r[i] - 1));
			}
		}
		printf("%d\n", (ans * 3));
	}
//	printf(".6lf\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}


你可能感兴趣的:(HDU1505 City Game (DP,HDU1506加强版))