博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
10774: matrix
阅读量:5278 次
发布时间:2019-06-14

本文共 1254 字,大约阅读时间需要 4 分钟。

10774: matrix

题目描述

现在有一个n*m的01矩阵,矩阵的行与行可以互相交换,我们现在想知道在一个最优的交换方案中,其中最大的全1子矩阵能有多大。

 

输入

第一行两个整数n,m。
接下来n行,每行一个长度为m的01字符串,描述这个01矩阵。
 

 

输出

一个数,即最大的全1子矩阵面积。

 

样例输入

复制样例数据

2 21011

样例输出

2

 

提示

对于30%的数据,n,m<=10。

对于70%的数据,n,m<=1000。
对于100%的数据,n,m<=5000。

 
寒假的题 碰到类似的 就回来写一下
 
思路:
用sum[i][j]记录 第i行 到第j列这个位置
连续的1的数量
然后从1开始枚举每一列,用cnt[i]记录
到这一列中连续出现i个的数量,那么i*cnt[i]就是换行之后出现的各种矩形的面积
注意cnt[i] cnt[j] 若i>j 相乘的时候 j = j+i    ( 就是短的也可以用长的 )
代码:
#include 
using namespace std;const int maxn = 5005;int Map[maxn][maxn]; int main(){ int n,m; char s[maxn]; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%s",s+1); for(int j=1;j<=m;j++) { Map[i][j] = s[j]-'0'; if(Map[i][j]) Map[i][j] += Map[i][j-1]; } } int ans = 0; int maxx = m; int cnt[maxn]={
0}; for(int j=1;j<=m;j++) { for(int i=0;i<=n;i++) //str[i][j] 为到这一列的连续长度 { if(Map[i][j]!=0) { cnt[Map[i][j]]++; } } for(int i=m;i>=1;i--) { ans = max(ans,i*cnt[i]); cnt[i-1]+=cnt[i]; cnt[i] = 0; } } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/hao-tian/p/10437622.html

你可能感兴趣的文章
Java 中 静态方法与非静态方法的区别
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
线程池的概念
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>
mysql启动过程
查看>>
2017前端面试题总结
查看>>
Http GetPost网络请求
查看>>
SWIFT国际资金清算系统
查看>>
Sping注解:注解和含义
查看>>
站立会议第四天
查看>>
如何快速掌握一门技术
查看>>
利用AMPScript获取Uber用户数据的访问权限
查看>>
vagrant 同时设置多个同步目录
查看>>
python接口自动化28-requests-html爬虫框架
查看>>
生成随机数的模板
查看>>
Mysql 数据库操作
查看>>
转:linux终端常用快捷键
查看>>