HDU 2870 DP 最大完全子矩阵

来源:互联网 发布:淘宝上买火车票靠谱吗 编辑:程序博客网 时间:2024/06/06 20:15

HDU 1505 升级版

枚举a,b,c  各做一遍最大完全子矩阵

#include "stdio.h"#include "string.h"char a[1010][1010];int n,m,ans;int sum[1010][1010];int max(int a,int b){    if (a<b) return b;    else return a;}void solve(char key){    int i,j;    int le[1010],ri[1010];    memset(sum,0,sizeof(sum));    for (i=0; i<n; i++)        for (j=0; j<m; j++)        {            if (key=='a' && (a[i][j]=='w' || a[i][j]=='y' || a[i][j]=='z' || a[i][j]=='a'))  sum[i][j]=sum[i][j-1]+1;            if (key=='b' && (a[i][j]=='w' || a[i][j]=='x' || a[i][j]=='z' || a[i][j]=='b'))  sum[i][j]=sum[i][j-1]+1;            if (key=='c' && (a[i][j]=='x' || a[i][j]=='y' || a[i][j]=='z' || a[i][j]=='c'))  sum[i][j]=sum[i][j-1]+1;        }    for (j=0; j<m; j++)    {        for (i=0; i<n; i++)            le[i]=ri[i]=i;        for (i=0; i<n; i++)            while (sum[i][j]<=sum[le[i]-1][j] && le[i]>0)                le[i]=le[le[i]-1];        for (i=n-1; i>=0; i--)            while (sum[i][j]<=sum[ri[i]+1][j] && ri[i]<n-1)                ri[i]=ri[ri[i]+1];        for (i=0; i<n; i++)            ans=max(ans,(ri[i]-le[i]+1)*sum[i][j]);    }}int main(){    int i;    while (scanf("%d%d",&n,&m)!=EOF)    {        getchar();        for (i=0; i<n; i++)            gets(a[i]);        ans=0;        solve('a');        solve('b');        solve('c');        printf("%d\n",ans);    }}


0 0
原创粉丝点击