hdu 2870 Largest Submatrix

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2870


hdu 1505的加强版。。枚举+DP。

分明知道思路了。。但是发现打出来还是有点困难。。

还是不够熟练。

下面是转载某大牛的代码:

#include<iostream>
using namespace std;

const int maxn=1005;
int h[maxn][maxn];
int l[maxn],r[maxn];
char str[maxn][maxn];
int n,m;
int ans;

int max(int a,int b)
{   return a>b?a:b;  }

void DP()
{
	int i,j;
    for( i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
            l[j]=r[j]=j;

        h[i][0]=h[i][m+1]=-1;

        for(j=1;j<=m;++j)
      	while(h[i][j]<=h[i][l[j]-1])
                l[j]=l[l[j]-1];
     	for(j=m;j>=1;j--)
		while(h[i][j]<=h[i][r[j]+1])
				r[j]=r[r[j]+1];

		for( j=1;j<=m;++j)
			ans=max(ans,h[i][j]*(r[j]-l[j]+1));
    }
}
int main()
{
    memset(h[0],0,sizeof(h[0]));
    while(scanf("%d%d",&n,&m)!=EOF)
    {
		int i,j;
        ans=0;
        for( i=1;i<=n;++i)
            scanf("%s",str[i]+1);
        for( i=1;i<=n;++i)
            for( j=1;j<=m;++j)
                if(str[i][j]=='a'||str[i][j]=='w'||str[i][j]=='y'||str[i][j]=='z')
                    h[i][j]=h[i-1][j]+1;
                else
                    h[i][j]=0;
				DP();
				for( i=1;i<=n;++i)
					for( j=1;j<=m;++j)
						if(str[i][j]=='b'||str[i][j]=='w'||str[i][j]=='x'||str[i][j]=='z')
							h[i][j]=h[i-1][j]+1;
						else
							h[i][j]=0;
						DP();
						for( i=1;i<=n;++i)
							for( j=1;j<=m;++j)
								if(str[i][j]=='c'||str[i][j]=='x'||str[i][j]=='y'||str[i][j]=='z')
									h[i][j]=h[i-1][j]+1;
								else
									h[i][j]=0;
								DP();
								printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(c)