【最大子矩阵】hdu 2870

来源:互联网 发布:ronald jenkees知乎 编辑:程序博客网 时间:2024/06/05 03:10

该题首先转化为只含有a,b,c的矩阵,然后对每一行dp求该列连续相同字母的最大高度,然后就可以每行每行地gao,又转化为求最大矩阵面积,就像hdu  1506一样,迭代地求左右>=当前高度的下标,hdu 1506代码看这里

#include <list>#include <map>#include <set>#include <queue>#include <string>#include <deque>#include <stack>#include <algorithm>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <limits.h>#include <time.h>#include <string.h>using namespace std;#define LL long long#define PI acos(-1.0)#define Max INT_MAX#define Min INT_MIN#define eps 1e-8#define FRE freopen("a.txt","r",stdin)#define N 1010int max(int a,int b){return a>b?a:b;}char str[N][N];int dp[N][N];int l[N],r[N];int n,m;int ans;void gao(){    int i,j,k;    for(i=1;i<=n;i++){        for(j=1;j<=m;j++){            l[j]=j;            r[j]=j;        }        dp[i][0]=dp[i][m+1]=-1;        for(j=1;j<=m;j++)        while(dp[i][l[j]-1] >= dp[i][j])        l[j]=l[l[j]-1];        for(j=m;j>=1;j--)        while(dp[i][r[j]+1] >= dp[i][j])        r[j]=r[r[j]+1];        for(j=1;j<=m;j++)            ans=max(ans,(r[j]-l[j]+1)*dp[i][j]);    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF){        int i,j;        for(i=1;i<=n;i++)scanf("%s",str[i]+1);        for(i=0;i<=m;i++)dp[0][i]=0;        ans=0;        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')                dp[i][j]=dp[i-1][j]+1;                else                dp[i][j]=0;            }        }        gao();        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')                dp[i][j]=dp[i-1][j]+1;                else                dp[i][j]=0;            }        }        gao();        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')                dp[i][j]=dp[i-1][j]+1;                else                dp[i][j]=0;            }        }        gao();        printf("%d\n",ans);    }    return 0;}

原创粉丝点击