今天段學妹說在做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;
}