动态规划统计正方形子矩阵
问题
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
示例 1:
输入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
输出:15
解释:边长为 1 的正方形有 10 个。边长为 2 的正方形有 4 个。边长为 3 的正方形有 1 个。正方形的总数 = 10 + 4 + 1 = 15.
示例 2:
输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:边长为 1 的正方形有 6 个。边长为 2 的正方形有 1 个。正方形的总数 = 6 + 1 = 7.
提示:
1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1
方法
创一个dp数组等于matrix,和一个nums用于统计正方形个数。
计算正方形边长方程:
dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1
该方程的含义:
表示从当前可得正方形的右下角点dp[i][j]的左方,上方,以及左上三个方向取最小值+1,即为当前最大正方形的边长值(因为要取正方形的最大边长,所有边长必须相等,故一定是取三个方向的最小值,才能保证边长相等)
此时nums+=dp[i][j],解释原因例如:
如果dp[i][j]=3,那么以dp[i][j]该点为正方形的右下角,存在一个边长为3的正方形,同时,边长为3的正方形会包含一个边长比它小的正方形,故在dp[i][j]处还能取到边长为2,边长为1的正方形,故该点能取边长为 1,2,3的三个正方形,故nums+=dp[i][j]。
代码示例:
class Solution:def countSquares(self, matrix: List[List[int]]) -> int:dp,nums=matrix,0for i in range(len(matrix)):for j in range(len(matrix[0])):if matrix[i][j]==1:if i>=1 and j>=1:dp[i][j]=min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1nums+=dp[i][j]return nums
动态规划统计正方形子矩阵相关推荐
- C语言求最大正方形子矩阵,动态规划—统计全为1的正方形子矩阵个数|最大正方形...
最大正方形 (统计全为 1 的正方形子矩阵) 解析可以参考leetcode解析 public class Solution { public int countSquares(int[][] matr ...
- leetcode1277. 统计全为 1 的正方形子矩阵(dp)
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数.示例 1:输入:matrix = [[0,1,1,1],[1,1,1,1],[ ...
- LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)
1. 题目 给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1, ...
- leetcode题库1277-- 统计全为 1 的正方形子矩阵
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1,1,1,1] ...
- leetcode算法题--统计全为 1 的正方形子矩阵
原题链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/ 相关题目:最大正方形 动态规划O(m * n ...
- 【动态规划】最大子矩阵之和
最大子矩阵 Description 给出一个N [2<=N<=100],并给出一个N*N的矩阵,矩阵中的数为[-127,127]之间.求出矩阵中一块子矩阵的最大和. 比如: 0 -2 -7 ...
- P2241 统计正方形和长方形
import java.util.Scanner;public class P2241 {static int T,n,m;static Long a,b;//a正方形个数,b长方形个数.public ...
- 2016.4.2 动态规划练习--讲课整理
1.codevs1742 爬楼梯 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明家外面有一个长长的楼梯,共N阶.小明的腿 ...
- 一般动态规划问题合集(Leetcode题解-Python语言)
118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...
最新文章
- cmd pc如何开多个微信_Win10下个人微信与企业微信多开
- 王守仁的学前教育思想
- 成功解决ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERR
- 从身份管理系统思考企业CMDB的建设
- vue ajax加载动画,vue 请求加载数据的时候如何显示加载动画
- 心电信号去噪(part4)--经验模态分解法(EMD)
- Serverless在SaaS领域的最佳实践
- RabbitMQ管控台操作手册
- python抽学号程序_python:简单的学生管理系统
- 局域网电话软件系统功能与应用
- What Music简单的全网音乐播放器
- 计算机底层:海明校验码。
- 区块链数字签名、验签,以及椭圆曲线算法JS库—elliptic的使用
- OpenGL-36-01SSAO
- Christian band介绍
- java弱化胖瘦客户端_Java架构师成长直通车百度云
- “新能源拐点”热议潮未退,小鹏却已经从华尔街赶到了港交所
- 006基于近似熵、递归量化分析和卷积神经网络的癫痫发作自动检测-2019
- Github客户端的下载与安装心得
- 阿里发聚安全5.0 剑指互联网业务安全
热门文章
- matlab抗混叠滤波器,音频抗混叠滤波器设计
- 网页打印的简单实现 + window.print
- 2019.06.28(day01)_java大数据课程体系
- 前端学习打卡day05
- Mysql主从复制的三种同步方式和半同步复制配置
- 所谓框架到底是什么?
- 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据
- 数字水印常见攻击类型汇总,噪声,缩放,旋转,剪切(附matlab代码)
- C#Windows7任务栏开发Thumbnail Toolbars(缩略图、工具栏按钮)
- 直方图均衡化、自适应直方图均衡化