学习动态规划-子矩阵

2023-11-19

1,全为1的最大正方形

在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。

来源:221. 最大正方形

解题思路:

dp[i][j]表示以matrix[i][j]为右下角的全1的正方形的最大边长。

很明显,当matrix[i][j]==0时,dp[i][j]=0;
当matrix[i][j]==1时,dp[i][j]的值为左上、上、左3个节点的最小值+1,即dp[i][j] = min{dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}+1。

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> dp(m, vector<int>(n));
        int result = 0;
        for (int i = 0; i < m; i++) {
            dp[i][0] = matrix[i][0] - '0';
            result = max(dp[i][0], result);
        }
        for (int j = 0; j < n; j++) {
            dp[0][j] = matrix[0][j] - '0';
            result = max(dp[0][j], result);
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == '0') continue;
                int t1 = dp[i-1][j];
                int t2 = dp[i][j-1];
                int t3 = dp[i-1][j-1];
                dp[i][j] = min(min(t1, t2), t3) + 1;
                result = max(result, dp[i][j]);
            }
        }
        return result * result;
    }
};

2,全为1的正方形个数

给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。

来源:1277. 统计全为 1 的正方形子矩阵

解题思路:

思路同题1,dp[i][j]表示以matrix[i][j]为右下角的全1的正方形的最大边长。

class Solution {
public:
    int countSquares(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        // dp[i][j]以matrix[i][j]为右下角能组成的最大正方形的边长
        vector<vector<int>> dp = matrix;
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) continue;
                dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
            }
        }
        int result = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                result += dp[i][j];
            }
        }
        return result;
    }
};

3,全为1的最大矩形

给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。

来源:85. 最大矩形

解题思路:

按行将二维数组分解成多个子矩阵,前1行、前2行、前3行和前4行组成的子矩阵分别如下:

每个子矩阵利用 84. 柱状图中最大的矩形 的解法计算最大矩形。

class Solution {
public:
    int maximalRectangle(vector<vector<char>>& matrix) {
        if (matrix.empty()) return 0;
        vector<int> dp(matrix[0].size() + 2);
        int result = 0;
        for (int i = 0; i < matrix.size(); i++) {
            for (int j = 0; j < matrix[i].size(); j++) {
                if (matrix[i][j] == '0') {
                    dp[j+1] = 0;
                } else {
                    dp[j+1] += 1;
                }
            }
            result = max(result, largestRectangleArea(dp));
        }
        return result;
    }
    int largestRectangleArea(vector<int>& heights) { // heights两边已经添加了0
        stack<int> s;
        int result = 0;

        for (int i = 0; i < heights.size(); i++) {
            while (!s.empty() && heights[s.top()] > heights[i]) {
                // 出栈,并计算area
                int height = heights[s.top()];
                s.pop();
                int width = (i - 1) - (s.top() + 1) + 1;
                result = max(result, height * width);
            }
            s.push(i);
        }
        
        return result;
    }
};

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习动态规划-子矩阵 的相关文章

随机推荐

  • 【机器学习】十大算法之一 “朴素贝叶斯”

    作者主页 爱笑的男孩 的博客 CSDN博客 深度学习 活动 python领域博主爱笑的男孩 擅长深度学习 活动 python 等方面的知识 爱笑的男孩 关注算法 python 计算机视觉 图像处理 深度学习 pytorch 神经网络 ope
  • Ubuntu openKylin 安装open VMware tool 工具

    修改source添加 cat etc apt sources list deb http archive build openkylin top openkylin yangtze main cross pty deb http archi
  • Oracle19c配置OGG进行单用户数据同步测试

    目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一 数据库操作 1 开启数据库附加日志 2 开启数据库归档模式 3 开启goldengate同步 4 创建goldengate管理用户 5 集成捕获所需权限授权 6 创建测
  • java判断指定路径文件夹是否存在,若不存在则创建新的文件夹,存在则删除

    isFile 判断是否 是文件 也许可能是文件或者目录 exists 判断是否存在 可能不存在 两个不一样的概念 isDirectory 是检查一个对象是否是文件夹 返回值是boolean类型的 如果是则返回true 否则返回false 调
  • DGA域名可以是色情网站域名

    恶意域名指传播蠕虫 病毒和特洛伊木马或是进行诈骗 色情内容传播等不法行为的网站域名 恶意域名指传播蠕虫 病毒和特洛伊木马或是进行诈骗 色情内容传播等不法行为的网站域名 本文面临能够的挑战 就是恶意网站经营者所使用的各种技术 近年来 FFSN
  • git lfs原理和使用

    如果我们用git管理的项目中出现了一些大文件 同时若其数量比较多 而且更新又比较频繁 那么当首次clone该项目时 就会不可避免地将这些大文件的当前版本和历史所有版本的文件都下载下来 虽然你很可能用不到这些历史文件 但是却不得不为它们所占用
  • 一般数据库服务器物理机配置,ironic部署物理机

    原标题 ironic部署物理机 ironic是openstack的帐篷项目之一 主要用来部署和管理裸机 提供统一接口 方便nova同时管理裸机和虚机 ironic的概念架构图如图1所示 本文以tecs3 0为例 介绍ironic部署裸机的流
  • border之border-style用法

    border style border style 属性用于设置元素所有边框的样式 或者单独地为各边设置边框样式 border style兼容性很好 基本所有浏览器都兼容 border style拥有一下属性值 值 描述 none 定义无边
  • 【RuoYi-Vue-Plus】问题笔记 02 - Knife4j

    文章目录 前言 问题一 文档页面空白 问题二 文档参数无法显示 问题原因 解决方案 前言 今天遇到一个很 sao 不 得 常 一 见 匹 的问题 所以必须要把这部血泪史记录一下 注 因为是开发中的项目 所以适当打码 不影响问题描述 首先描述
  • STM32入门——uKeil5 MDK 的使用(基于固件库)

    文章目录 1 Keil uVision5 MDK 是什么 2 建立一个标准库函数工程 2 1 前期准备 2 2 建立工程 2 3 建立组文件夹 2 4 添加文件 2 4 配置 魔术棒 选项卡 2 5 建立 main 函数 1 Keil uV
  • scala 学习笔记

    Scala Scala 和 java 关系 语言特点 Scala是一门以Java虚拟机 JVM 为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言 静态语言需要提前编译的如 Java c c 等 动态语言如 js Sc
  • 吴昊品游戏核心算法 Round 10 —— 吴昊教你下围棋(利用递归来解决吃子的问题)...

    如图所示 此即为日本动漫棋魂中的千年佐为 也就是SAI 众所周知 围棋的规则相比于中国象棋 国际象棋等等都简单许多 真是因为更简单的规则 才诞生 了更复杂的逻辑 目前的围棋AI还很不行 最NB的应该是日本人做出的后又经过众多中国的围棋爱好者
  • STM32使用HAL库,整体结构和函数原理介绍

    按照杨桃电子的说法 学习编程程序就是学习使用外设 然后需要在icode文件夹中创建对应的 c和 h文件 分三步来操作 1 学会编写板级驱动程序 2 学会在板级驱动程序中调用HAL库中的功能函数 3 学会在main 主函数中调用板级驱动程序
  • 跟李沐学AI——动手学深度学习 PyTorch版——学习笔记pycharm版本(第四天——10、11、12、13、14)2023.3.1

    前言 这是沐神的第十节课 是讲多层感知机的 需要掌握牢固 以后会经常写的 代码讲解 跳过从零开始实现 直接进入简单代码的讲解 导入包 import torch from torch import nn from d2l import tor
  • Git的基本使用

    Git的基本使用 一 本文主要介绍Git 实现基本的代码托管 适合初次接触Git的开发人员 高级用法请查阅后续文章 目录 Git用途 Git代码托管平台 Git工作流程 概念介绍 工作流程 Git使用步骤 版本管理 分支管理 常用的分支命名
  • 《图解物联网》--阅读笔记

    第1 章物联网的基础知识1 1 1 物联网入门 2 1 1 1 物联网 2 1 1 2 物联网的相关动向 2 1 2 物联网所实现的世界 3 1 2 1 泛在网络 社会 3 1 2 2 物 的互联网连接 4 1 2 3 机器对机器通信所实现
  • Java String类型和BigDecimal类型之间的转化及BigDecimal类型的介绍

    String和BigDecimal的相互转化 String a 50 00 字符串类型 必须是数字 否则会报错 java lang NumberFormatException 异常 BigDecimal b new BigDecimal a
  • 汇编语言有如下的汇编程序段,请完成code段中的代码,实现将string1段和string2段中的数据拷贝到string3段中,并且将string3段中的数据输出到屏幕。

    有如下的汇编程序段 请完成code段中的代码 实现将string1段和string2段中的数据拷贝到string3段中 并且将string3段中的数据输出到屏幕 题目 有如下的汇编程序段 请完成code段中的代码 实现将string1段和s
  • Bose700降噪体验

    戴了多年耳塞 还是决定买一块主动降噪的看看 第一款主动降噪耳机当然选择降噪最强的bose700 直接官方旗舰店买不废话 虽然是主动降噪 不过众所周知是主要降低频部分1KHz以下 所以呢 给小白的用话小白会说 人声 喇叭声 风扇声都是听得到的
  • 学习动态规划-子矩阵

    1 全为1的最大正方形 在一个由 0 和 1 组成的二维矩阵内 找到只包含 1 的最大正方形 并返回其面积 来源 221 最大正方形 解题思路 dp i j 表示以matrix i j 为右下角的全1的正方形的最大边长 很明显 当matri