hdu 2830 Matrix Swapping II
来源:互联网 发布:知乎关注排名 编辑:程序博客网 时间:2024/04/30 09:41
题意:可以任意交换两行,求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作为整数读入不行!!
0 0
- hdu 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 - Matrix Swapping II
- HDU 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- HDU 2830 Matrix Swapping II *
- HDU 2830 Matrix Swapping II
- #HDU 2830 Matrix Swapping II
- hdu 2830 Matrix Swapping II
- 一些异常的处理
- SVG DOM常用属性和方法介绍
- 黑马程序员 <交通管理系统>
- Android模拟器横屏切换方法
- UML类图几种关系的总结
- hdu 2830 Matrix Swapping II
- [Java开发] 拦截器与过滤器的区别
- 简单bfs
- db2 事务日志使用
- Fisher Vector
- 排序
- 在C#中使用API函数FINDWINDOW查找窗体
- UML序列图总结
- 黑马程序员-参数传递