#HDU 1505 dp 最大子矩阵

来源:互联网 发布:2017最新拼图软件 编辑:程序博客网 时间:2024/06/07 06:22

City Game

题意:在一个由”R”、”F”组成的大矩阵中求出一个最大的全是”F”的最大子矩阵。

分析:对于这个题目,我们可以参照HDU 1506,类型相同,只需转换一下就可以做。对于每一行,我们求出每一个元素向上可以达到的最大高度( 即 HDU 1506 中的柱形的高度),这样就转化成m组柱形,对每一组都去求出最大的子矩阵即可。

TIPS:答案是“m组中最大的矩阵 * 3”;

代码如下

#include <algorithm>#include <bitset>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <map>#include <queue>#include <set>#include <stack>#include <string>#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;#define MAXN 1005int a[MAXN][MAXN],L[MAXN][MAXN],R[MAXN][MAXN];int main(){    int ans,temp,T,m,n;    scanf("%d",&T);    while(T--){        memset(a,0,sizeof(a));        memset(L,0,sizeof(L));        memset(R,0,sizeof(R));        scanf("%d%d",&m,&n);        for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++){                char s[5];                scanf("%s",s);                if(s[0]=='F')                    a[i][j]=a[i-1][j]+1;//当前向上的最大连续高度                else                    a[i][j]=0;            }        }        /* for(int i=1;i<=m;i++){            for(int j=1;j<=n;j++){                cout<<a[i][j]<<" ";            }            cout<<endl;        }*/        ans=0;        for(int i=1;i<=m;i++){            L[i][1]=1;            for(int j=2;j<=n;j++){                int k=j;                while(k>1&&a[i][j]<=a[i][k-1])k=L[i][k-1];                L[i][j]=k;            }            R[i][n]=n;            for(int j=n-1;j>=1;j--){                int k=j;                while(k<n&&a[i][j]<=a[i][k+1])k=R[i][k+1];                R[i][j]=k;            }            temp=0;            for(int j=1;j<=n;j++){                if( temp < a[i][j]*(R[i][j]-L[i][j]+1) ){                    temp = a[i][j]*(R[i][j]-L[i][j]+1);                }            }            if(ans<temp)ans=temp;        }        printf("%d\n",ans*3);    }    return 0;}

JNU-ACM-ICPC
WYC

原创粉丝点击