zoukankan      html  css  js  c++  java
  • 10774: matrix

    10774: matrix

    题目描述

    现在有一个n*m的01矩阵,矩阵的行与行可以互相交换,我们现在想知道在一个最优的交换方案中,其中最大的全1子矩阵能有多大。

    输入

    第一行两个整数n,m。
    接下来n行,每行一个长度为m的01字符串,描述这个01矩阵。
     

    输出

    一个数,即最大的全1子矩阵面积。

    样例输入

    2 2
    10
    11
    

    样例输出

    2
    

    提示

    对于30%的数据,n,m<=10。
    对于70%的数据,n,m<=1000。
    对于100%的数据,n,m<=5000。

     
    寒假的题 碰到类似的 就回来写一下
     
    思路:
    用sum[i][j]记录 第i行 到第j列这个位置连续的1的数量
    然后从1开始枚举每一列,用cnt[i]记录到这一列中连续出现i个的数量,那么i*cnt[i]就是换行之后出现的各种矩形的面积
    注意cnt[i] cnt[j] 若i>j 相乘的时候 j = j+i    ( 就是短的也可以用长的 )
    代码:
    #include <bits/stdc++.h>
     
    using namespace std;
    const int maxn = 5005;
    int Map[maxn][maxn];
     
    int main()
    {
        int n,m;
        char s[maxn];
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",s+1);
            for(int j=1;j<=m;j++)
            {
                Map[i][j] = s[j]-'0';
                if(Map[i][j])
                    Map[i][j] += Map[i][j-1];
            }
        }
     
        int ans = 0;
        int maxx = m;
        int cnt[maxn]={0};
        for(int j=1;j<=m;j++)
        {
            for(int i=0;i<=n;i++)  //str[i][j] 为到这一列的连续长度
            {
                if(Map[i][j]!=0)
                {
                    cnt[Map[i][j]]++;
                }
            }
            for(int i=m;i>=1;i--)
            {
                ans = max(ans,i*cnt[i]);
                cnt[i-1]+=cnt[i];
                cnt[i] = 0;
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    我参与过的开源项目
    chineking / WeiboCrawler / wiki / Home — Bitbucket
    PIL应用之生成验证码图片
    hurl
    Hadoop笔记之安装及伪分布式模式配置
    httpbin(1): HTTP Client Testing Service
    动态规划求编辑距离 残阳似血的博客
    cppreference.com
    sscanf
    在python中定义二维数组
  • 原文地址:https://www.cnblogs.com/hao-tian/p/10437622.html
Copyright © 2011-2022 走看看