51nod 1158 全是1的最大子矩阵 单调栈
来源:互联网 发布:linux 递归授权 编辑:程序博客网 时间:2024/06/05 11:54
题目链接:
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1158
题意:
给出个的矩阵,里面的元素只有0或1,找出M1的一个子矩阵,M1中的元素只有1,并且的面积是最大的。输出的面积
题解:
单调栈,把每一列数看成一个数组。
代码:
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define MS(a) memset(a,0,sizeof(a))#define MP make_pair#define PB push_backconst int INF = 0x3f3f3f3f;const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}//////////////////////////////////////////////////////////////////////////const int maxn = 1e5+10;int a[505][505],f[505][505];struct node{ int v,pre,nxt; node(int v) : v(v),pre(1),nxt(1) {}};int main(){ int n,m; cin >> n >> m; for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin >> a[i][j]; MS(f); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) if(a[i][j]) f[i][j] = f[i][j-1] + 1; // 每一位置可以向左拓展几个 ll ans = -1; for(int j=1; j<=m; j++){ // 对每一列数进行一次单调栈的拓展 stack<node> s; s.push(node(f[1][j])); for(int i=2; i<=n; i++){ node t(f[i][j]); while(!s.empty() && t.v<=s.top().v){ // 出现比栈顶小的行数,就要弹出,因为已经不能向后拓展了 node tt = s.top(); s.pop(); if(!s.empty()) s.top().nxt += tt.nxt; // 向后拓展 t.pre += tt.pre; // 向前拓展 ll tmp = tt.v * (tt.pre+tt.nxt-1); // 计算矩形的面积 if(ans < tmp) ans = tmp; } s.push(t); } while(!s.empty()){ node tt = s.top(); s.pop(); if(!s.empty()) s.top().nxt += tt.nxt; ll tmp = tt.v * (tt.pre+tt.nxt-1); if(ans < tmp) ans = tmp; } } cout << ans << endl; return 0;}
0 0
- [51nod 1158 全是1的最大子矩阵] 单调栈
- 51nod-1158 全是1的最大子矩阵(单调栈)
- 51nod 1158 全是1的最大子矩阵 单调栈
- 51 nod 1158 全是1的最大子矩阵(单调栈)
- 51Nod 1158 全是1的最大子矩阵【单调栈】
- 51nod 1158 全是1的最大子矩阵 (单调栈) 详细图解
- 51nod-1158 . 全是1的最大子矩阵 &&CODEVS-2491 玉蟾宫(枚举+单调栈 or dp)
- 51nod 1158:全是1的最大子矩阵
- 51nod 1158 全是1的最大子矩阵
- 51Nod-1158-全是1的最大子矩阵
- 51NOD 1158 全是1的最大子矩阵
- 51nod 1158 全是1的最大子矩阵
- 51Nod 1158 全是1的最大子矩阵
- 51nod 1158 全是1的最大子矩阵
- 51Nod-1157-全是1的最大子矩阵
- 51nod 1158 全是1的最大子矩阵 (暴力枚举)
- 九度1497:面积最大的全1子矩阵 (单调队列,单调栈)
- 全是1的最大子矩阵
- 文章标题
- 数字和的运算算法剖析
- 校内互测 [from abclzr] T2 (DP)
- Python3 cookbook学习笔记-数据结构与算法6
- HTTPS和HTTP的区别
- 51nod 1158 全是1的最大子矩阵 单调栈
- MCU学习——无线遥控模块
- iOS 面试题
- 子网掩码及子网划分问题
- ipython及ipython notebook常用操作
- React 还是 Vue: 你应该选择哪一个Web前端框架?
- vb.net与vb的区别
- 个推 通过第三方个推开发者平台实现
- LintCode :主元素