HDU 2870 Largest Submatrix(dp最大子矩阵和)

来源:互联网 发布:js input value 赋值 编辑:程序博客网 时间:2024/05/22 06:41

1505,1506的加强版,这里一共有三种情况,一开始想的是dp的时候变幻,但是那样根本不可能,所以要预处理,不同种的组合如果旁边和自己的种类不一样,那么旁边的高度就是0,想到这个就可以开a,b,c三个数组纪录高度,如果i是a,那么a数组有值,i两边都不是a或者不能变幻为a,那么高度是0,就可以转化成1505一样的了。

</pre><pre name="code" class="cpp">////  main.cpp//  Richard////  Created by 邵金杰 on 16/9/14.//  Copyright © 2016年 邵金杰. All rights reserved.//#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1000+10;int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];int la[maxn],ra[maxn],lb[maxn],rb[maxn],lc[maxn],rc[maxn];char s[maxn][maxn];int n,m;void change(){    memset(a,0,sizeof(a));    memset(b,0,sizeof(b));    memset(c,0,sizeof(c));    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(s[i][j]=='a'||s[i][j]=='w'||s[i][j]=='y'||s[i][j]=='z') a[i][j]=1+a[i-1][j];            if(s[i][j]=='b'||s[i][j]=='w'||s[i][j]=='x'||s[i][j]=='z') b[i][j]=1+b[i-1][j];            if(s[i][j]=='c'||s[i][j]=='x'||s[i][j]=='y'||s[i][j]=='z') c[i][j]=1+c[i-1][j];        }    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        int MAX=-1;        for(int i=1;i<=n;i++)            scanf("%s",s[i]+1);        change();        for(int i=1;i<=n;i++)        {            la[1]=lb[1]=lc[1]=1;            ra[m]=rb[m]=rc[m]=m;            for(int j=2;j<=m;j++)            {                int t=j;                while(t>1&&a[i][t-1]>=a[i][j]) t=la[t-1];                la[j]=t;                t=j;                while(t>1&&b[i][t-1]>=b[i][j]) t=lb[t-1];                lb[j]=t;                t=j;                while(t>1&&c[i][t-1]>=c[i][j]) t=lc[t-1];                lc[j]=t;            }            for(int j=m-1;j>=1;j--)            {                int t=j;                while(t<m&&a[i][t+1]>=a[i][j]) t=ra[t+1];                ra[j]=t;                t=j;                while(t<m&&b[i][t+1]>=b[i][j]) t=rb[t+1];                rb[j]=t;                t=j;                while(t<m&&c[i][t+1]>=c[i][j]) t=rc[t+1];                rc[j]=t;            }            for(int j=1;j<=m;j++)            {                MAX=max(MAX,(ra[j]-la[j]+1)*a[i][j]);                MAX=max(MAX,(rb[j]-lb[j]+1)*b[i][j]);                MAX=max(MAX,(rc[j]-lc[j]+1)*c[i][j]);            }        }        cout<<MAX<<endl;    }    return 0;}


0 0
原创粉丝点击