首页 > 其他分享 >最大正方形

最大正方形

时间:2024-05-30 19:44:39浏览次数:23  
标签:最大 int long 正方形 边长 节点

题目描述

在一个 $n\times m$ 的只包含 $0$ 和 $1$ 的矩阵里找出一个不包含 $0$ 的最大正方形,输出边长。

输入格式

输入文件第一行为两个整数 $n,m(1\leq n,m\leq 100)$,接下来 $n$ 行,每行 $m$ 个数字,用空格隔开,$0$ 或 $1$。

输出格式

一个整数,最大正方形的边长。

样例输入

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

样例输出

2

算法1

(动态规划) $O(n^m)$

主要思想:

1.状态定义
f[i][j]表示以 [i][j]为结尾的最大正方形的最大变长

2.if(g[i][j]==1) - 初步判断当前节点是否为合法的节点
3.状态计算
f[i][j] =min( min(f[i-1][j],f[i][j-1]), f[i-1][j-1]) + 1;
f[i-1][j] 表示 包括 (i,j) 节点 向左连续 x个节点
f[i][j-1] 表示 包括 (i,j) 节点 向上连续 x个节点
f[i-1][j],f[i][j]等价于 从(i,j)节点 向左向上连续x个节点的合法格子

  • 两个当中取小的为正方形的边长(细品)
    • 1 表示包括当前格子
  • 最后枚举所有合法的方案中取最大值

时间复杂度

C++ 代码

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

const int N = 110 ;

#define int long long

int n,m;
int g[N][N];
int f[N][N];

signed main() {

	cin >> n >> m;
	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++)
			cin>>g[i][j];

	for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++)
		 {
		 	if(g[i][j]==1)  //当前节点是否为合法的节点
			 f[i][j] = min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1])+1;
			 
		 }
		
		int res=f[0][0];
		for(int i = 1; i <= n; i ++)
		for(int j = 1; j <= m; j ++)
		 res=max(res,f[i][j]);
		
		cout<<res;
		return 0;
		}

标签:最大,int,long,正方形,边长,节点
From: https://www.cnblogs.com/ltphy-/p/18223102

相关文章

  • Leecode热题100--215:数组中的第k个最大值
    题目:给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。时间复杂度为O(n)的算法解法一:利用STL特性解题:#include<iostream>#include<vector>#include<algorithm>usingnamespac......
  • 【Python Cookbook】S01E03 找到最大最小的N个元素
    目录问题解决方案讨论问题如何在一个集合中找到最大或最小的N个元素?解决方案使用heapq模块。pipinstallheapqheapq模块中,有nlargest()以及nsmallest()两个函数:importheapqnums=[1,8,23,2,7,-4,8,18,42,37]print(heapq.nlargest(3,n......
  • 按组计算每列最大最小值并横向填入格中
    第1列是分组列,之后是N个数据列。ABCD1ZN_1N_2Q_122A100200-1003A101-10-2004A102201-1045A991993006B1000110013007B10041200-9008C2000-210022009C1900-2090-2180现在要按第1列分组,每组横向的2N个列,依次是组内每个数据列的最大值和最小值。ABCDEFG1ZN_1MaxN_1MinN_2Max......
  • leetCode. 85. 最大矩形
    leetCode.85.最大矩形部分参考上一题链接leetCode.84.柱状图中最大的矩形此题思路代码classSolution{public:intlargestRectangleArea(vector<int>&h){intn=h.size();vector<int>left(n),right(n);stack<int>......
  • leetcode 3165. 不包含相邻元素的子序列的最大和
    思路题目中不相邻子序列和的最大值是满足加和性质的,考虑使用线段树,这里我用了4颗线段树,sum[o][l][r]中l=0和l=1分别表示当前区间是否选取左端点作为子序列的一部分,r=0和r=1分别表示当前区间是否选取右端点作为子序列的一部分。接下来就是线段树单点更新。1#defineIOstd::i......
  • MySQL 满足条件函数中使用查询最大值函数
    在实际的数据库操作中,我们常常需要根据某些条件找到最大值并据此进行下一步的操作。例如,在一个包含订单信息的表中,可能需要找到特定客户的最大订单金额,并据此进行某些统计或决策。MySQL提供了多种函数和查询方法,可以在满足条件的情况下实现这一需求。本文将深入探讨如何在MyS......
  • 代码随想录算法训练Day20|LeetCode654-最大二叉树、LeetCode617-合并二叉树、LeetCode
    最大二叉树题目描述力扣654-最大二叉树给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在最大值左边的子数组前缀上构建左子树。递归地在最大值右边的子数组后缀上构建右子树。......
  • 数组中的第K个最大元素
    主管问到这个问题(数组中的第K个最大元素)。我首先答了partition算法时间复杂度O(n)空间复杂度O(1)。主管说不行,要用堆。然后(我回答)用建大根堆,取前k,时间复杂度O(n+klogn)初始化O(n),pop出k个O(klogn),空间复杂度O(k)(使用原数组建堆,pop出k个)。主管说都不行,然后(主管)给了个小根堆的算法......
  • 代码随想录算法训练营第第20天 | 654.最大二叉树 、617.合并二叉树 、700.二叉搜索
    654.最大二叉树又是构造二叉树,昨天大家刚刚做完中序后序确定二叉树,今天做这个应该会容易一些,先看视频,好好体会一下为什么构造二叉树都是前序遍历题目链接/文章讲解:https://programmercarl.com/0654.最大二叉树.html视频讲解:https://www.bilibili.com/video/BV1MG411G7ox......
  • P1734 最大约数和
    变形01背包#include<bits/stdc++.h>usingnamespacestd;constintN=1010;ints;intn,m;intv[N],w[N],f[N];intaccum(intp){//预先处理约数之和 intans=0; for(inti=1;i<=p-1;i++){//因为不包括它本身因此p-1;if(p%i==0)ans+=i; ......