HDU 1505 City Game

题意也很容易理解: 求最大子矩阵 R代表不能被使用,F代码可以使用。

嗯,算是1506的变形吧!

先计算下每一列的矩阵长度,然后按照1506来搞就可以了!

当然,还需要其它简单的控制。。。。。参照上篇blog!(强烈推荐……)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NN 1010
#define Max(a,b) (a>b?a:b)
int map[NN][NN];
int l[NN],r[NN];
__int64 ans;
void dp(int cur,int n)
{
	int i;
	for(i=1;i<=n;i++){
		l[i]=r[i]=i;
	}
	for(i=1;i<=n;i++){
		while(map[cur][l[i]-1] >= map[cur][i])
			l[i] = l[l[i]-1];
	}
	for(i=n;i>=1;i--){
		while(map[cur][r[i]+1] >= map[cur][i])
			r[i] = r[r[i]+1];
	}
	for(i=1;i<=n;i++){
		ans  = Max(ans,map[cur][i]*(r[i]-l[i]+1));
	}
}
int main()
{
	int t,n,m,i,j;
	char s[2];
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)map[i][0]=-1;
		map[n+1][0]=-2;
		for(i=1;i<=n;i++){
			for(j=1;j<=m;j++){
				scanf("%s",s);
				if(s[0] == 'R'){
					map[i][j] = 0;
					map[i][0] = -2;
				}
				else map[i][j] = map[i-1][j] + 1;
			}
			map[i][j]= -1;
		}
		ans = 0;
		for(j=1;j<=n;j++){
			if(map[j+1][0] == -2){
				dp(j,m);
			}
		}
		printf("%I64d\n",ans*3);
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值