首页 > 其他分享 >51nod-1158 全是1的最大子矩阵(单调栈)

51nod-1158 全是1的最大子矩阵(单调栈)

时间:2023-06-12 17:33:07浏览次数:37  
标签:1158 51nod 矩阵 ++ int num maxn Stack


原题链接



1158 全是1的最大子矩阵



基准时间限制:1 秒 空间限制:131072 KB 分值: 80  难度:5级算法题



 收藏

 关注


Input


第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。


Output


输出最大全是1的子矩阵的面积。


Input示例


3 31 1 01 1 10 1 1


Output示例


4




求出每个位置向右延伸,连续1的最大值,图中的矩阵就变为

1 2 0 

1 2 3

0 1 2


然后用单调栈求出每个位置,对应的行最长区间,使该位置在这区间上是最小值


#include <bits/stdc++.h>
#define maxn 505
using namespace std;

int num[maxn][maxn], p[maxn][maxn];
int Left[maxn][maxn], Right[maxn][maxn];
int Stack[maxn];
int main(){
	
	//freopen("in.txt", "r", stdin);
	int m, n;
	
	scanf("%d%d", &m, &n);
	for(int i = 0; i < n; i++)
	 for(int j = 0; j < m; j++)
	  scanf("%d", &num[i][j]);
	for(int i = 0; i < n; i++){
		int h = m;
		for(int j = m-1; j >= 0; j--){
			if(num[i][j] == 0)
			 h = j;
			else{
				p[i][j] = h - j;
			}
		}
	}
	for(int j = 0; j < m; j++){
		int e = 0;
		for(int i = 0; i < n; i++){
		    if(p[i][j] == 0){
		    	e = 1;
		    	Stack[0] = i;
		    }
		    else{
		    	while(e && p[i][j] <= p[Stack[e-1]][j])
		    	 e--;
		    	if(e)
		    	 Left[i][j] = i - Stack[e-1];
		    	else
		    	 Left[i][j] = i + 1;
		    	Stack[e++] = i;
		    }
		}
	}
	for(int j = 0; j < m; j++){
		int e = 0;
		for(int i = n-1; i >= 0; i--){
			if(p[i][j] == 0){
				e = 1;
				Stack[0] = i;
			}
			else{
				while(e && p[i][j] <= p[Stack[e-1]][j])
				 e--;
				if(e)
				 Right[i][j] = Stack[e-1] - i;
				else
				 Right[i][j] = n - i;
				Stack[e++] = i;
			}
		}
	}
	int ans = 0;
	for(int i = 0; i < n; i++)
	 for(int j = 0; j < m; j++){
	 	if(p[i][j]){
	 		ans = max(ans, p[i][j] * (Right[i][j] + Left[i][j] - 1));
	 	}
	 }
	 printf("%d\n", ans);
	 
	 return 0;
}




标签:1158,51nod,矩阵,++,int,num,maxn,Stack
From: https://blog.51cto.com/u_16158872/6464281

相关文章

  • 杨氏矩阵中找是否存在k
    //杨氏矩阵查找k是否存在时间复杂数小于O(N),O(N)为穷举法用的时间intFindNum1(int(*arr)[3],intk,introw,intcol){ inti=0; intj=col-1; while(i<row&&j>0) { if(arr[i][j]<k) { i++; } elseif(arr[i][j]>k) { j--; } else { return......
  • 矩阵乘法与动态 DP 入门
    矩阵乘法及广义矩阵乘法前置知识:矩阵相关基础概念。记\(A(i,j)\)表示矩阵\(A\)的第\(i\)行第\(j\)列,\(n_A\)为\(A\)的行数,\(m_A\)为\(A\)的列数。定义矩阵加法\(A+B\)为(\(n_A=n_B,m_A=m_B\)):\[\\\\\[A+B](i,j)=A(i,j)+B(i,j)\]矩阵加法有交换律,结合......
  • 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络
    2023-06-10:给定一个由n个节点组成的网络,用nxn个邻接矩阵graph表示在节点网络中,只有当graph[i][j]=1时,节点i能够直接连接到另一个节点j。一些节点initial最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意软件......
  • 2023-06-10:给定一个由 n 个节点组成的网络,用 n x n 个邻接矩阵 graph 表示 在节点网络
    2023-06-10:给定一个由n个节点组成的网络,用nxn个邻接矩阵graph表示在节点网络中,只有当graph[i][j]=1时,节点i能够直接连接到另一个节点j。一些节点initial最初被恶意软件感染。只要两个节点直接连接,且其中至少一个节点受到恶意软件的感染,那么两个节点都将被恶意......
  • 2022-2023 春学期 矩阵与数值分析 C7 常微分方程的数值解法
    2022-2023春学期矩阵与数值分析C7常微分方程的数值解法原文C7常微分方程的数值解法问题描述一阶常微分方程的初值问题\[\left\{\begin{array}{l}u'=f(t,u),\;a\leqt\leqb\\u(a)=u_0\end{array}\right.\]解的存在唯一性:若\(f(t,u)\)满足Lipschitz条件,即存在......
  • 项目管理的3种组织结构盘点:职能型、项目型、矩阵型
    没有组织架构的企业将是一盘散沙,组织架构不合理会严重阻碍企业的正常运作,甚至导致企业经营的彻底失败。相反,适宜、高效的组织架构能够最大限度的释放企业的能量,使组织更好发挥协同效应,达到“1+1>2”的合理运营状态。今天我们就来了解一下组织架构都有哪几种形式,其优缺点是什么。......
  • Luogu P1939 【模板】矩阵加速(数列)
    【模板】矩阵加速(数列)题目描述已知一个数列\(a\),它满足:\[a_x=\begin{cases}1&x\in\{1,2,3\}\\a_{x-1}+a_{x-3}&x\geq4\end{cases}\]求\(a\)数列的第\(n\)项对\(10^9+7\)取余的值。输入格式第一行一个整数\(T\),表示询问个数。以下\(T\)行,每行一个正......
  • Luogu P3390 【模板】矩阵快速幂
    【模板】矩阵快速幂题目背景一个\(m\timesn\)的矩阵是一个由\(m\)行\(n\)列元素排列成的矩形阵列。即形如\[A=\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&\vdots&\ddots&......
  • Luogu B2105 矩阵乘法(模板)
    矩阵乘法题目描述计算两个矩阵的乘法。\(n\timesm\)阶的矩阵\(A\)乘以\(m\timesk\)阶的矩阵\(B\)得到的矩阵\(C\)是\(n\timesk\)阶的,且\(C[i][j]=A[i][0]\timesB[0][j]+A[i][1]\timesB[1][j]+\)……\(+A[i][m-1]\timesB[m-1][j](C[i][j]\)表示\(C\)......
  • 51矩阵键盘数码管动态显示
    一、实验目的1、了解矩阵键盘扫描方法。2、了解数码管动态显示方法。二、实验内容1、完成读取矩阵键盘并静态显示。2、完成完成读取矩阵键盘并动态显示。三、实验原理四、实验电路与程序1、软件实验一:完成读取矩阵键盘并静态显示。1)实验要求:单片机完成读取矩阵键盘并通过八段......