博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Largest Submatrix of All 1’s(思维+单调栈)
阅读量:5049 次
发布时间:2019-06-12

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

Given a m-by-n (0,1)-matrix, of all its submatrices of all 1’s which is the largest? By largest we mean that the submatrix has the most elements.

Input

The input contains multiple test cases. Each test case begins with m and n (1 ≤ mn ≤ 2000) on line. Then come the elements of a (0,1)-matrix in row-major order on mlines each with n numbers. The input ends once EOF is met.

Output

For each test case, output one line containing the number of elements of the largest submatrix of all 1’s. If the given matrix is of all 0’s, output 0.

Sample Input

2 20 00 04 40 0 0 00 1 1 00 1 1 00 0 0 0

Sample Output

04

题意:

找最大的为1的子矩阵,

一开始的错误代码:H是表示他的连续高度,L和R是左边第一个比他小的坐标和右边比他小的坐标,这个过程都是单调栈维护的,

然后暴力枚举最大的点,但是这样有错误,就是L到R这个区间内H的值不一定是相同的

错误代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const int maxn=1e5+5;typedef long long ll;using namespace std;int n,m;int Map[2005][2005];int H[2005][2005];int L[2005][2005];int R[2005][2005];int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); while(cin>>n>>m) { for(int t=1;t<=n;t++) { for(int j=1;j<=m;j++) { scanf("%d",&Map[t][j]); } } for(int t=1;t<=n;t++) { for(int j=1;j<=m;j++) { if(Map[t][j]==1) { H[t][j]=1; } else { H[t][j]=0; } } } memset(L,0,sizeof(L)); for(int t=1;t<=n;t++) { for(int j=1;j<=m;j++) { R[t][j]=m+1; } } for(int t=2;t<=n;t++) { for(int j=1;j<=m;j++) { if(H[t-1][j]!=0&&H[t][j]==1) { H[t][j]=H[t-1][j]+1; } } } for(int t=1;t<=n;t++) { stack
S1; for(int j=1;j<=m;j++) { while(S1.size() && Map[t][S1.top()]>=Map[t][j]) S1.pop(); if(S1.empty()) L[t][j]= 0; else L[t][j] = S1.top(); S1.push(j); } } for(int t=1;t<=n;t++) { stack
S1; for(int j=m;j>=1;j--) { while(S1.size() && Map[t][S1.top()]>=Map[t][j]) S1.pop(); if(S1.empty()) R[t][j]= m+1; else R[t][j] = S1.top(); S1.push(j); } } int manxx=0; for(int t=1;t<=n;t++) { for(int j=1;j<=m;j++) { if(H[t][R[t][j]-1]==H[t][L[t][j]+1]) manxx=max(manxx,H[t][j]*(R[t][j]-L[t][j]-1)); } } cout<
<

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
const int maxn=2e5+5;typedef long long ll;using namespace std;int H[2005];int a[2005];int main(){ std::ios::sync_with_stdio(false); std::cin.tie(0); int n,m,x,top,tmp,maxnxx; stack
S1; while(cin>>n>>m) { maxnxx=0; memset(H,0,sizeof(H)); for(int t=0;t
=a[S1.top()]) { S1.push(j); } else { while(!S1.empty()&&a[j]
maxnxx) maxnxx=tmp; } S1.push(top); a[top]=a[j]; } } } cout<
<

 

 

转载于:https://www.cnblogs.com/Staceyacm/p/10781765.html

你可能感兴趣的文章
hostname
查看>>
SpringBoot使用其他的Servlet容器
查看>>
关于cookie存取中文乱码问题
查看>>
k8s架构
查看>>
select 向上弹起
查看>>
mysql 多表管理修改
查看>>
group by order by
查看>>
bzoj 5252: [2018多省省队联测]林克卡特树
查看>>
https 学习笔记三
查看>>
Oracle学习之简单查询
查看>>
log4j配置
查看>>
linux 配置SAN存储-IPSAN
查看>>
双链表
查看>>
java学习笔记之String类
查看>>
pymysql操作mysql
查看>>
Linux服务器删除乱码文件/文件夹的方法
查看>>
牛腩记账本core版本源码
查看>>
Word Break II
查看>>
UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
查看>>
BZOJ4669抢夺(费用流+二分答案)
查看>>