• 1157 全是1的最大子矩阵


    题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1157

    1157 全是1的最大子矩阵

     
    给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积。
     

    输入

    第1行:2个数m,n中间用空格分隔(2 <= m,n <= 100)
    第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。

    输出

    输出最大全是1的子矩阵的面积。

    输入样例

    3 3
    1 1 0
    1 1 1
    0 1 1

    输出样例

    4

    思路:枚举以当前所在位置的高度为真正高度,向左和向右最远能走到哪,存储最大值就行
    看代码:
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e2+5;
    int a[maxn][maxn];
    int h[maxn];//存该列往上有多少个1
    int l[maxn],r[maxn];
    int main()
    {
        int N,M;
        int ans=0;
        cin>>N>>M;
        for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) cin>>a[i][j];
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=M;j++)
            {
    //            cout<<"*"<<endl;
                if(a[i][j]==1) h[j]++;
                else h[j]=0;
            }
            h[0]=h[M+1]=-1;
            for(int j=1;j<=M;j++)
            {
    //            cout<<"**"<<endl;
                int k=j;
                while(h[j]<=h[k-1]) k=l[k-1];
                l[j]=k;
            }
    //        cout<<1<<endl;
            for(int j=M;j>=1;j--)
            {
    //            cout<<"***"<<endl;
                int k=j;
                while(h[j]<=h[k+1]) k=r[k+1];
                r[j]=k;
            }
            for(int j=1;j<=M;j++)
            {
    //            cout<<"****"<<endl;
                int x=h[j]*(r[j]-l[j]+1);
                ans=max(ans,x);
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e2+5;
    int a[maxn][maxn];
    int h[maxn];//存该列往上有多少个1
    int l[maxn],r[maxn];
    int main()
    {
        int N,M;
        int ans=0;
        cin>>N>>M;
        for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) cin>>a[i][j];
        for(int i=1;i<=N;i++)
        {
            for(int j=1;j<=M;j++)
            {
    //            cout<<"*"<<endl;
                if(a[i][j]==1) h[j]++;
                else h[j]=0;
            }
            h[0]=h[M+1]=-1;
            for(int j=1;j<=M;j++)
            {
    //            cout<<"**"<<endl;
                int k=j;
                while(h[j]<=h[k-1]) k=l[k-1];
                l[j]=k;
            }
    //        cout<<1<<endl;
            for(int j=M;j>=1;j--)
            {
    //            cout<<"***"<<endl;
                int k=j;
                while(h[j]<=h[k+1]) k=r[k+1];
                r[j]=k;
            }
            for(int j=1;j<=M;j++)
            {
    //            cout<<"****"<<endl;
                int x=h[j]*(r[j]-l[j]+1);
                ans=max(ans,x);
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    Compact Framework访问内嵌资源文件
    RBAC权限设计图 [转]
    c# 中判断用户是否按下CTRL键
    分享开发soket经验 我的基于socket的持久层 [转]
    没事教宝宝画画
    界面开发(一)[转]
    Winform中多国语言窗体的设计以及.NET中资源文件的使用[转]
    我眼中的理想系统
    C# WinForm开发系列 Socket/WCF/Rometing/Web Services[转]
    基于RBAC的权限设计模型[转]
  • 原文地址:https://www.cnblogs.com/caijiaming/p/11218101.html
Copyright © 2020-2023  润新知