hdu 2870 Largest Submatrix(hdu 1505的加强版)

1.ans=max(全为a的最大矩阵,全为b的最大矩阵,全为c的最大矩阵)

2.代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int INF=1<<30;
char mat[1005][1005];
int a[1005][1005];
int b[1005][1005];
int c[1005][1005];
int La[1005],Ra[1005];
int Lb[1005],Rb[1005];
int Lc[1005],Rc[1005];

int main()
{
    int m,n;
    int ans;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    while(scanf("%d%d",&m,&n)==2)
    {
        for(int i=1;i<=m;i++)
        {
            scanf("%s",mat[i]+1);
        }
        ans=-INF;
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(mat[i][j]=='a'||mat[i][j]=='w'||mat[i][j]=='y'||mat[i][j]=='z')
                    a[i][j]=1;
                else
                    a[i][j]=0;
                if(mat[i][j]=='b'||mat[i][j]=='w'||mat[i][j]=='x'||mat[i][j]=='z')
                    b[i][j]=1;
                else
                    b[i][j]=0;
                if(mat[i][j]=='c'||mat[i][j]=='x'||mat[i][j]=='y'||mat[i][j]=='z')
                    c[i][j]=1;
                else
                    c[i][j]=0;
            }
        }
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i][j]==1)
                    a[i][j]+=a[i-1][j];
                if(b[i][j]==1)
                    b[i][j]+=b[i-1][j];
                if(c[i][j]==1)
                    c[i][j]+=c[i-1][j];
            }
            for(int j=1;j<=n;j++)
            {
                La[j]=j;
                while(La[j]>1&&a[i][La[j]-1]>=a[i][j])
                    La[j]=La[La[j]-1];
            }
            for(int j=1;j<=n;j++)
            {
                Lb[j]=j;
                while(Lb[j]>1&&b[i][Lb[j]-1]>=b[i][j])
                    Lb[j]=Lb[Lb[j]-1];
            }
            for(int j=1;j<=n;j++)
            {
                Lc[j]=j;
                while(Lc[j]>1&&c[i][Lc[j]-1]>=c[i][j])
                    Lc[j]=Lc[Lc[j]-1];
            }
            for(int j=n;j>=1;j--)
            {
                Ra[j]=j;
                while(Ra[j]<n&&a[i][Ra[j]+1]>=a[i][j])
                    Ra[j]=Ra[Ra[j]+1];
            }
            for(int j=n;j>=1;j--)
            {
                Rb[j]=j;
                while(Rb[j]<n&&b[i][Rb[j]+1]>=b[i][j])
                    Rb[j]=Rb[Rb[j]+1];
            }
            for(int j=n;j>=1;j--)
            {
                Rc[j]=j;
                while(Rc[j]<n&&c[i][Rc[j]+1]>=c[i][j])
                    Rc[j]=Rc[Rc[j]+1];
            }
            for(int j=1;j<=n;j++)
            {
                ans=max(ans,a[i][j]*(Ra[j]-La[j]+1));
            }
            for(int j=1;j<=n;j++)
            {
                ans=max(ans,b[i][j]*(Rb[j]-Lb[j]+1));
            }
            for(int j=1;j<=n;j++)
            {
                ans=max(ans,c[i][j]*(Rc[j]-Lc[j]+1));
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-11-06 20:29:59

hdu 2870 Largest Submatrix(hdu 1505的加强版)的相关文章

HDU 2870 Largest Submatrix(DP)

题意  求最大相同字符子矩阵  其中一些字符可以转换 其实就是HDU1505 1506的加强版  但是分了a,b,c三种情况  看哪次得到的面积最大 对于某一个情况  可以把该字符和可以转换为该字符的位置赋值0 其它位置赋值1 这样就转化成了求最大全0矩阵的问题了 对于转换后矩阵中的每个点 看他向上有多少个连续0 把这个值存在h数组中 再用l数组和r数组记录h连续大于等于该位置的最左边位置和最右位置 这样包含(i,j)点的最大矩阵面积就是(r[i][j]-l[i][j]+1)*h[i][j] 面

HDU 2870 Largest Submatrix (单调栈)

http://acm.hdu.edu.cn/showproblem.php?pid=2870 Largest Submatrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1569    Accepted Submission(s): 748 Problem Description Now here is a matrix wit

hdu 2870 Largest Submatrix

Largest Submatrix http://acm.hdu.edu.cn/showproblem.php?pid=2870 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Now here is a matrix with letter 'a','b','c','w','x','y','z' and you can change '

HDU 1506 &amp;&amp; HDU1505 &amp;&amp; HDU 2870 (DP).

~~~~ 这三道DP题是逐层递进的,大家可以从前往后做. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506 http://acm.hdu.edu.cn/showproblem.php?pid=1505 http://acm.hdu.edu.cn/showproblem.php?pid=2870 ~~~~ 1506: 分别找每一块板子的可以的最左边界和最右边界,注意这时不能用两个for暴力(显然会TLE),所以要用DP的思想边搜边保存. 另外注

hdu 4029 Distinct Sub-matrix (后缀数组)

题目大意: n*m的矩阵中,有多少个子矩阵不是同的. 思路分析: 假设这题题目只是一维的求一个串中有多少个子串是不同的. 那么也就是直接扫描height,然后减去前缀. 现在变成二维,如何降低维度. 知道hash 的作用就是将一个串映射到一个数字. 那我们就将这个矩阵hash,考虑到不同的长度和宽度都会导致不同, 所以就要枚举子矩阵的宽度. hash [i][j] 就表示在当前宽度W 下,从 第 i 行 第 j 个开始往后W长度的串的hash值. 然后将列上相同起点的hash值 子串. 然后将所

Largest Submatrix(动态规划)

Largest Submatrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2018    Accepted Submission(s): 967 Problem Description Now here is a matrix with letter 'a','b','c','w','x','y','z' and you ca

POJ 3494 Largest Submatrix of All 1’s

POJ 2796 Feel Good HDU 1506 Largest Rectangle in a Histogram 和这两题一样的方法. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=2000+10; int a[maxn]; int L[maxn],R[maxn]; int m,n;

POJ 3494 Largest Submatrix of All 1&#39;s 栈的运用 好题

Language: Default Largest Submatrix of All 1’s Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 5185   Accepted: 1950 Case Time Limit: 2000MS Description Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest

HDU 4311 Meeting point-1 &amp;&amp; HDU 4312 Meeting point-2

这俩个题  题意::给出N(<1e5)个点求找到一个点作为聚会的地方,使每个点到达这里的距离最小.4311是 曼哈顿距离 4312是 切比雪夫距离: 曼哈顿距离 :大家都知道 对于二维坐标系a(xa,yb),b(xb,yb)的曼哈顿距离是abs(xa-xb)+abs(ya-yb): 看的出来这个距离和x,y 都有关,但是X,Y并不相互影响,所以可以分开计算这样,分开计算的好处如下: 如果 只给一个维度的坐标系 ,我们是不可以再什么养的复杂度的时间内处理出来呢? 大难还是很好想的先排序一下,会发现