zoukankan      html  css  js  c++  java
  • hdu2830 可交换行的最大子矩阵

    题意:
          求最大子矩阵,但是相邻的列之间可以相互交换...


    思路:
          回想下固定的情况,记得那种情况是开俩个数组 L[i] ,R[i],记录小于等于i的最左边和最右边在哪个位置,对于这个题目,可以交换,也就是说顺序是可以自己随意更改的,那么我们直接sort一便,然后在找最大就行了,说下具体过程,便于理解
    开始我们创建一个数组dp[i] ,记录第i列到当前j的位置的连续最大子序列,我们假设每一样都是矩形的下低,我们在开个数组tmp记录所有的dp,然后sort,之后可以开个数组L,R什么的,
    但也可以不开,因为排序的原因,我们只要这样就行了 
    for(j = 1 ;j <= m ;j ++) ans = maxx(ans ,dp[j] * j);(这个是从大到小排序)
    或者 for(j = m ;j >= 1 ;j --) ans = maxx(ans ,dp[j] * (m - j + 1));(从小到大)

    任选一个都行,无所谓..时间复杂度是O(n * m + lg(m));

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    
    #define N (1000 + 100)
    #define INF -1000000000
    
    using namespace std;
    
    int dp[N];
    int tmp[N];
    char str[N];
    
    int main ()
    {
       int n ,m ,i ,j ,num ,ans;
       while(~scanf("%d %d" ,&n ,&m))
       {
          ans = INF;
          memset(dp ,0 ,sizeof(dp));
          for(i = 1 ;i <= n ;i ++)
          {
             scanf("%s" ,&str);
             for(j = 0 ;j < m ;j ++)           
             {
                if(str[j] - '0') dp[j+1]++;
                else dp[j+1] = 0;
                tmp[j+1] = dp[j+1];
             }        
             sort(tmp + 1 ,tmp + m + 1);
             for(int ii = m ;ii >= 1 ;ii --)
             {
                if(!tmp[ii]) break;
                if(ans < tmp[ii] * (m - ii + 1))
                ans = tmp[ii] * (m - ii + 1);
             }
          }
          printf("%d
    " ,ans);
       }
       return 0;
    }
             
    


  • 相关阅读:
    关于ping github.com超时的解决办法
    git使用过程中的若干问题笔记
    PAT甲级1017题解——模拟排序
    第七章4
    第七章3
    第七章2
    第七章1
    第六章4
    第六章3
    第六章2
  • 原文地址:https://www.cnblogs.com/csnd/p/12063144.html
Copyright © 2011-2022 走看看