HDU 2870 Largest Submatrix

嗯,题意也很容易理解,让求最大子矩阵,但是有几个字母是可以改变其值的,和前面1505又不一样,算是它的变形吧,没有做过前面两道题的推荐先看一下, 然后再做这个就会感觉简单很多……囧,我是这样做的!嘿嘿

嗯,可以把这个矩阵变成三个不同的矩阵(分别是a,b,c)然后按照1505题的思路做它就OK了!当然如果不会1505的话,可以先做1506

如果1506也没有思路,好吧,你可以看别人的报告了!嘿嘿。。。。。



#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1010
#define Max(a,b) (a>b?a:b)
char map[N][N];
int set[N][N];
int l[N],r[N];
__int64 ans;
int n,m;
void dp(int cur)
{
	int i;
	for(i=1;i<=m;i++)
		l[i] = r[i] = i;
	for(i=1;i<=m;i++){
		while(set[cur][l[i]-1] >= set[cur][i])
			l[i] = l[l[i]-1];
	}
	for(i=m;i>=1;i--){
		while(set[cur][r[i]+1] >= set[cur][i])
			r[i] = r[r[i]+1];
	}
	for(i=1;i<=m;i++)
		ans = Max(ans,set[cur][i]*(r[i] - l[i] +1));
	return ;
}
void dp_init()
{
	int i;
	for(i=1;i<=n;i++)
		if(set[i+1][0] == -2)
			dp(i);
		return ;
}
void solve(char ch)
{
	int i,j;
	//memset(set,0,sizeof(set));
	set[n+1][0] = -2;
	for(i=1;i<=n;i++){
		set[i][0]=-1;
		for(j=1;j<=m;j++){
			if(map[i][j] == ch)
				set[i][j] = set[i-1][j] +1;
			else if(ch == 'a'){
				if(map[i][j] == 'w' || map[i][j] == 'y' || map[i][j] == 'z')
					set[i][j] = set[i-1][j] +1;
				else {
					set[i][0] = -2;
					set[i][j] = 0;
				}
			}
			else if(ch == 'b'){
				if(map[i][j] == 'w' || map[i][j] == 'x' || map[i][j] == 'z')
					set[i][j] = set[i-1][j] +1;
				else {
					set[i][0] = -2;
					set[i][j] = 0;
				}
			}
			else if(ch == 'c'){
				if(map[i][j] == 'x' || map[i][j] == 'y' || map[i][j] == 'z')
					set[i][j] = set[i-1][j] +1;
				else {
					set[i][0] = -2;
					set[i][j] = 0;
				}
			}
		}
		set[i][j] = -1;
	}
	dp_init();
	return ;
}
int main()
{
	int i;
	while(~scanf("%d%d",&n,&m))
	{
		for(i=1;i<=n;i++)
			scanf("%s",map[i]+1);
		ans = 0;
		solve('a');
		solve('b');
		solve('c');
		printf("%I64d\n",ans);
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值