题意:可以任意交换两行,求01矩阵中最大的全1矩阵。
还是和hdu 1505一样的处理方法。
统计的时候学到了一招,我自己想到的是o(N^3)的统计方法,就是只要
不小于当前位置的就tmp++。然后a[i]*tmp,在所有结果中找最大值ans。
这里用到了一个小技巧,就像那个开0-10000的数组作计数器,找n个集合的
交集的那题一样。
zoj 1143 && poj 1044 Date bugs
这题统计也是用的逐行统计每列高度,用h[j]计数高度j出现的次数。然后逆序扫一遍h数组。
把比当前高度高或者相等的高度个数累加。就可以计算面积了。
h[j]计数高度为j的个数,本来就是升序排列,逆序扫一遍,就从后往前递推着累加了,
刚好可以利用上一个的结果。好巧妙哈哈= =
#include<cstdio> #include<iostream> #include<cstring> using namespace std; char mp[1005][1005]; int a[1005][1005]; int h[1005]; int main() { int n,m,ans,tmp,t; while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%s",mp[i]+1); for(int j=1;j<=m;j++) { if(mp[i][j]==‘1‘) a[i][j]=a[i-1][j]+1; else a[i][j]=0; } } /*for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%d",a[i][j]); printf("\n"); }*/ ans=-1; for(int i=1;i<=n;i++) { memset(h,0,sizeof(h)); for(int j=1;j<=m;j++) h[a[i][j]]++; for(int j=m-1;j>=1;j--) h[j]+=h[j+1]; for(int j=1;j<=m;j++) { tmp=h[j]*j; if(tmp>ans) ans=tmp; } } printf("%d\n",ans); } return 0; }
这题读入矩阵好像非得要用char 数组啊= =
我开始将0 1作为整数读入不行!!