Maximal Square 基本动态规划:二维--力扣101算法题解笔记

7.3Maximal Square 基本动态规划:二维

题目描述

给定一个二维0-1矩阵,求全由1构成的最大正方形面积

输入输出样例

Input :

\["1","0","1","0","0",

"1","0","1","1","1",

"1","1","1","1","1",

"1","0","0","1","0"\]

Output:4

题解

动态规划问题,还是看看能不能转换为数组求解。定义一个二维dp数组,dpij表示满足题目条件的,以(i,j)为右下角的正方形或者是长方形的属性。对于这个题就是表示以(i,j)为右下角的圈1构成的最大正方形面积。如果当前位置是0,那么dpij = 0.如果当前是1,假设dpij = k^2,他的充分条件就是dpi-1j-1,dpij-1,和dpi-1j的值必须不小于(k-1)^2。否则(i,j)位置不可以构成一个边长为k的正方形。所以,如果这三个值的最小值为k-1,则(i,j)位置一定且最大可以构成一个边长为k的正方形。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int maximalSquare(vector<vector<char>>& matrix){
    if (matrix.empty() || matrix[0].empty()) {
        return 0;
    }
    int m = matrix.size(), n = matrix[0].size(), max_side = 0;
    vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= n; ++j) {
            if (matrix[i - 1][j - 1] == '1') {
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) + 1;
            }
            max_side = max(max_side, dp[i][j]);
        }
    }
    return max_side * max_side;
}

int main() {
    vector<vector<char>> matrix = {
        {'1','0','1','0','0'},
        {'1','0','1','1','1'},
        {'1','1','1','1','1'},
        {'1','0','0','1','0'}
    };
    cout << maximalSquare(matrix) << endl;
    return 0;
}
相关推荐
小智老师PMP17 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN21 分钟前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a1879272183134 分钟前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤1 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate2 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran2 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹2 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统
疯狂打码的少年3 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
子文雨3 小时前
基于 uC3845 与 ATtiny13 双芯片架构的 8.4V/2.5Ah 锂电池智能充电器设计
单片机·嵌入式硬件·算法
青山木3 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法