HDU2830-----DP最大子矩阵系列
来源:互联网 发布:淘宝diy u盘好 编辑:程序博客网 时间:2024/05/22 10:22
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=2830
题目意思:
给你一个n*m的01矩阵
任意两个列是可以交换的
要你求由1的组成的最大矩阵的元素个数
解题思路:
因为列是可以变化的
我们先枚举以第i行为底的最大子矩阵
对于每一个h[j],我们只要知道所有比它大的有多少个就OK
那怎么求呢
用HASH,这简直就是神器!!!
我们先扫一遍每个h[j]有多少个,然后对于以第i行为底的而言,最大的h[j]也就是i
因为我们是要求大于h[j]的,所以从大到小扫,hash[h[j]]+=hash[h[j]+1]
然后再就是求h[j]*hash[h[j]]了
下面上代码:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 1010;int hash[maxn];int data[maxn][maxn];int h[maxn][maxn];int main(){ int n,m; while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%1d",&data[i][j]); memset(h,0,sizeof(h)); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) if(data[i][j]) h[i][j] = h[i-1][j]+1; } int ans=-1; for(int i=1;i<=n;i++) { memset(hash,0,sizeof(hash)); for(int j=1;j<=m;j++) { hash[h[i][j]]++; } for(int j=i;j>=0;j--) hash[j]+=hash[j+1]; for(int j=1;j<=m;j++) { int tmp = h[i][j]*hash[h[i][j]]; if(ans<tmp) ans=tmp; } } printf("%d\n",ans); } return 0;}
- HDU2830-----DP最大子矩阵系列
- hdu2830 可交换行的最大子矩阵
- 最大子矩阵 (DP)
- 最大子矩阵 DP
- poj1050(dp最大子矩阵)
- 最大子矩阵和【dp】
- hdu1559 最大子矩阵(DP)
- 最大子矩阵问题(dp)
- HDU1559-最大子矩阵 DP
- 最大子矩阵问题<DP>
- HDU1559 最大子矩阵【DP】
- BZOJ1084 最大子矩阵 [DP]
- ZOJ1074 最大和子矩阵 DP最大连续子序列
- DP(最大子段和) 最大子矩阵 poj_1050
- Bailian2766 最大子矩阵【最大子段和+DP】
- ZOJ1074 最大和子矩阵 DP
- poj 1050 【最大子矩阵和DP】
- hdu 1559【最大子矩阵和DP】
- (转)链表反向链表的相关操作
- 归并排序
- 关于appweb配置详解
- java的Calendar时间类
- <Java编程思想> 初始化与清理
- HDU2830-----DP最大子矩阵系列
- void* memchr( void *pv, unsigned char ch, size_t size )
- 交叉编译GDB7.6
- IE下点击scrollbar会导致焦点移动到body
- CSDN一月使用感受
- NULL值的总结
- 用2个数字输出你想要的汉字
- ios开发切换页面特效
- 写给明天的软件工程师——感悟篇