问题

给你一个 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

动态规划统计正方形子矩阵相关推荐

  1. C语言求最大正方形子矩阵,动态规划—统计全为1的正方形子矩阵个数|最大正方形...

    最大正方形 (统计全为 1 的正方形子矩阵) 解析可以参考leetcode解析 public class Solution { public int countSquares(int[][] matr ...

  2. leetcode1277. 统计全为 1 的正方形子矩阵(dp)

    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数.示例 1:输入:matrix = [[0,1,1,1],[1,1,1,1],[ ...

  3. LeetCode 1277. 统计全为 1 的正方形子矩阵(DP)

    1. 题目 给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1, ...

  4. leetcode题库1277-- 统计全为 1 的正方形子矩阵

    给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数. 示例 1: 输入:matrix = [[0,1,1,1],[1,1,1,1] ...

  5. leetcode算法题--统计全为 1 的正方形子矩阵

    原题链接:https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/ 相关题目:最大正方形 动态规划O(m * n ...

  6. 【动态规划】最大子矩阵之和

    最大子矩阵 Description 给出一个N [2<=N<=100],并给出一个N*N的矩阵,矩阵中的数为[-127,127]之间.求出矩阵中一块子矩阵的最大和. 比如: 0 -2 -7 ...

  7. P2241 统计正方形和长方形

    import java.util.Scanner;public class P2241 {static int T,n,m;static Long a,b;//a正方形个数,b长方形个数.public ...

  8. 2016.4.2 动态规划练习--讲课整理

    1.codevs1742 爬楼梯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 小明家外面有一个长长的楼梯,共N阶.小明的腿 ...

  9. 一般动态规划问题合集(Leetcode题解-Python语言)

    118. 杨辉三角 class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i ...

最新文章

  1. cmd pc如何开多个微信_Win10下个人微信与企业微信多开
  2. 王守仁的学前教育思想
  3. 成功解决ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERR
  4. 从身份管理系统思考企业CMDB的建设
  5. vue ajax加载动画,vue 请求加载数据的时候如何显示加载动画
  6. 心电信号去噪(part4)--经验模态分解法(EMD)
  7. Serverless在SaaS领域的最佳实践
  8. RabbitMQ管控台操作手册
  9. python抽学号程序_python:简单的学生管理系统
  10. 局域网电话软件系统功能与应用
  11. What Music简单的全网音乐播放器
  12. 计算机底层:海明校验码。
  13. 区块链数字签名、验签,以及椭圆曲线算法JS库—elliptic的使用
  14. OpenGL-36-01SSAO
  15. Christian band介绍
  16. java弱化胖瘦客户端_Java架构师成长直通车百度云
  17. “新能源拐点”热议潮未退,小鹏却已经从华尔街赶到了港交所
  18. 006基于近似熵、递归量化分析和卷积神经网络的癫痫发作自动检测-2019
  19. Github客户端的下载与安装心得
  20. 阿里发聚安全5.0 剑指互联网业务安全

热门文章

  1. matlab抗混叠滤波器,音频抗混叠滤波器设计
  2. 网页打印的简单实现 + window.print
  3. 2019.06.28(day01)_java大数据课程体系
  4. 前端学习打卡day05
  5. Mysql主从复制的三种同步方式和半同步复制配置
  6. 所谓框架到底是什么?
  7. 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据
  8. 数字水印常见攻击类型汇总,噪声,缩放,旋转,剪切(附matlab代码)
  9. C#Windows7任务栏开发Thumbnail Toolbars(缩略图、工具栏按钮)
  10. 直方图均衡化、自适应直方图均衡化