HDOJ2830 Matrix Swapping II超水的一道不知道什麼題

今天段學妹說在做DP題,然後我就問她討了一道題,結果,這哪裏是DP了···

題目大意:

給定一個矩陣,矩陣由0、1構成,現可以移動任意列,問移動後所構成矩陣中由1構成的子矩陣的最大的面積。

分析:

首先我們來看一個簡單的例子:

1101

0101

0001

那麼經過移動後,形成了

0111

0011

0001

由1構成的自矩陣的最大面積顯然就是4了,如上圖紅色部分

那麼,所給的

1010

1001

0001

如何轉換成上面那種形式呢?

我們可以把上面那種形式倒轉過來,變成

0001

0011

0111

此時,我們用一個h[i]數組表示以這個位置爲底的連續最高的1,則

0001                   1010

0012                   2001

0123                   0002

然後把每一層進行排序,求一個不降序列的最大面積我想大家都懂吧,那麼,直接上代碼

 

#include<iostream>
#include<string>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,m,i,j,k[1001],ans,h[1001];
char temp[1001];
int main(){
    while (scanf("%d%d",&n,&m)!=EOF){
          ans=0;
          memset(h,0,sizeof(h));
          for (i=0;i<n;i++){
              scanf("%s",temp);
              for (j=0;j<m;j++)
                  if (temp[j]=='1') h[j]+=1; else h[j]=0;
              for (j=0;j<m;j++)//不能直接用h,因爲如果順序亂了上面就不能傳承了
                  k[j]=h[j];
              sort(k,k+m);
              for (j=0;j<m;j++)
                  if (k[j]!=0) ans=ans<(k[j]*(m-j))?(k[j]*(m-j)):ans;
              }
          printf("%d\n",ans);
          }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章