程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2830 Matrix Swapping II

HDU 2830 Matrix Swapping II

編輯:C++入門知識

枚舉所有的行,然後對於每個行,記錄到這行為止每列連續的1的個數,我們可以把每列看做寬度為1,

連續個數看做它的高度。

然後問題就可以看做在一些高度可能為0的相鄰矩形中找到最大矩形,即最大長方形那道題(HDU 1506)

應該注意的是列能任意移動,那麼將高度從大到小排序是最優的求解方法,然後有b[i-1]>=b[i],

面積顯然是h[i] * i . 然後枚舉.

[cpp]
#include <cstdio> 
#include<iostream> 
#include <cstring> 
#include <algorithm> 
using namespace std; 
int a[1010],b[1010]; 
bool cmp(int t1,int t2) 

     return t1>t2; 

int main() 

    int i,j,n,m,len,ans; 
    char ch[1001]; 
    while(scanf("%d%d",&n,&m)!=EOF) 
    { 
       memset(a,0,sizeof(a)); 
       ans=0; 
       for(i=1;i<=n;i++) 
       { 
          scanf("%s",ch); 
          len=strlen(ch); 
          for(j=0;j<len;j++) 
          { 
            if(ch[j]=='1') 
                a[j+1]++; 
            else a[j+1]=0; 
            b[j+1]=a[j+1]; 
          } 
          sort(b+1,b+1+m,cmp); 
        for(j=1;j<=m&&b[j];j++) 
            if(b[j]*j>ans) ans=b[j]*j; 
       
       } 
       printf("%d\n",ans); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved