51Nod 1158 最大子矩阵变形 前缀和+ DP || 单调栈
来源:互联网 发布:2016淘宝还能刷单吗 编辑:程序博客网 时间:2024/06/05 15:01
题目链接
题意:
一个
思路:
可以联系到求最大子矩阵和这个经典问题。
考虑DP做法,对于最大子矩阵和这个问题:
首先枚举子矩阵的开始行
对于
然后将每一行看成一个新的数组,求最大连续和,所有行的最大连续和的最大值即为最大子矩阵的和。
对于该问题,可以类似地处理,我们只需要保证新数组的每一个元素的值等于
虽然能AC,但这是一个非常危险的复杂度。
考虑优化:
上面的做法忽略了一个重要的已知条件,即该矩阵是一个
故我们其实并不需要用
故只需想办法解决子矩阵必须元素全为
考虑单调栈。
我们首先还是利用求最大子矩阵和的降维思想,对每一行求一个特殊的前缀和,对于
这样我们可以枚举每一列,将该列的元素值看成一个新的数组,对于第
利用单调栈处理出其左右第一个小于他的数即可。
总复杂度:
代码:
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int A = 500 + 10;int a[A][A],Stack[A],tot,L[A],R[A],n,m;int main(){ scanf("%d%d",&m,&n); for(int i=1 ;i<=n ;i++){ for(int j=1 ;j<=m ;j++){ scanf("%d",&a[i][j]); } } for(int i=1 ;i<=n ;i++){ for(int j=1 ;j<=m ;j++){ if(a[i][j]) a[i][j] = a[i][j-1] + 1; } } int ans = 0,st,ed; for(int j=1 ;j<=m ;j++){ tot = st = 0; for(int i=1 ;i<=n ;i++){ if(a[i][j] == 0) tot = 0,st = i; else{ while(tot && a[Stack[tot]][j]>=a[i][j]) tot--; if(tot == 0) L[i] = st; else L[i] = Stack[tot]; Stack[++tot] = i; } } tot = 0;ed = n+1; for(int i=n ;i>=1 ;i--){ if(a[i][j] == 0) tot = 0,ed = i; else{ while(tot && a[Stack[tot]][j]>=a[i][j]) tot--; if(tot == 0) R[i] = ed; else R[i] = Stack[tot]; Stack[++tot] = i; } } for(int i=1 ;i<=n ;i++){ if(a[i][j]) ans = max(ans,a[i][j]*(R[i]-L[i]-1)); } } printf("%d\n",ans); return 0;}
阅读全文
0 0
- 51Nod 1158 最大子矩阵变形 前缀和+ DP || 单调栈
- [51nod 1051 最大子矩阵和]前缀和+dp
- 51Nod 1051 最大矩阵和(DP—最大子段和变形)
- 51nod-1158 . 全是1的最大子矩阵 &&CODEVS-2491 玉蟾宫(枚举+单调栈 or dp)
- [bzoj1084][DP][前缀和]最大子矩阵
- 51Nod 1051 最大子矩阵和 (最大子段和变形)
- 51Nod 1050 循环数组最大子段和(DP—最大子段和变形)
- [51nod 1158 全是1的最大子矩阵] 单调栈
- 51nod-1158 全是1的最大子矩阵(单调栈)
- 51nod 1158 全是1的最大子矩阵 单调栈
- 51 nod 1158 全是1的最大子矩阵(单调栈)
- 51Nod 1158 全是1的最大子矩阵【单调栈】
- 51nod 1158 全是1的最大子矩阵 (单调栈) 详细图解
- 51nod 1051 最大子矩阵和 dp
- 51nod-dp入门-最大子矩阵和
- 【51Nod】1051 - 最大子矩阵的和(dp)
- 51Nod--1051最大子矩阵和(DP入门)
- 51nod 1051 最大子矩阵和【dp】
- 实现希尔排序算法。
- Android中获取TextView和EditText中的文本
- 幻方代码
- JAVA中数字与字母的转换(简单总结)
- java详解 --- Map接口
- 51Nod 1158 最大子矩阵变形 前缀和+ DP || 单调栈
- bzoj1056&bzoj1862 游戏排名系统 哈希+splay
- Keras入门课5 -- 网络可视化及训练监控
- Mysql中ifnull和if函数的使用
- PCL1.6.0+VS2010+CMake3.10.0
- keystone中的名词介绍
- MySql视频学习总结
- 基于3D卷积神经网络的人体行为理解
- 我在IT职场超15年:从程序员做到副总,送你21个超实用的职场法则!