hot100——动态规划

221.最大正方形

动态规划

动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

动态规划重点就在于,拆分子问题,记住过往,减少重复计算。

动态规划从较小问题的解,由交叠性质,逐步决策出较大问题的解,它是从f(1)往f(10)方向,往上推求解,所以称为自底向上的解法。

动态规划有几个典型特征,最优子结构、状态转移方程、边界、重叠子问题

动态规划的解题套路

什么样的问题可以考虑使用动态规划解决呢?

如果一个问题,可以把所有可能的答案穷举出来,并且穷举出来后,发现存在重叠子问题,就可以考虑使用动态规划。

比如一些求最值的场景,最长递增子序列、最小编辑距离、背包问题、凑零钱问题等等,都是动态规划的经典应用场景。

动态规划的解题思路

动态规划的核心思想就是拆分子问题,记住过往,减少重复计算。 并且动态规划一般都是自底向上的,具体的4个步骤如下:

  • 穷举分析
  • 确定边界
  • 找出规律,确定最优子结构
  • 写出状态转移方程

思路

①穷举分析

对于任意给定的矩阵,都是可以穷举出来的,此处不再赘述;

②确定边界

当matrix中元素为0的时候,不存在满足题中条件的情况,返回0;

③找出规律,确定最优子结构

什么是最优子结构:

一道动态规划问题,其实就是一个递推问题。假设当前决策结果是f(n),则最优子结构就是要让 f(n-k) 最优,最优子结构性质就是能让转移到n的状态是最优的,并且与后面的决策没有关系,即让后面的决策安心地使用前面的局部最优解的一种性质。

min(上, 左, 左上) + 1

④写出状态转移方程

代码

python

python 复制代码
class Solution(object):
    def maximalSquare(self, matrix):
        """
        :type matrix: List[List[str]]
        :rtype: int
        """
        m, n = len(matrix),len(matrix[0])
        f = [[0] * (n+1) for _ in range(m+1)]
        for i, row in enumerate(matrix):
            for j, ch in enumerate(row):
                if ch == '1':
                    f[i+1][j+1] = min(f[i][j], f[i][j+1], f[i+1][j]) + 1
        '''
        map(max,f): 对 f 里的每一行,分别求最大值(得到每行的最大边长)
        max(map(max,f)): 从 "每行的最大边长" 里,找整个 f 的全局最大边长
        max(map(max,f))**2: 边长平方
        '''
        return max(map(max,f)) ** 2

C++

cpp 复制代码
class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector f(m+1, vector<int>(n+1));
        int ans = 0;
        for(int i = 0; i< m;i++)
        {
            for(int j = 0;j<n;j++)
            {
                if(matrix[i][j] == '1')
                {
                    f[i+1][j+1] = min({f[i][j], f[i+1][j], f[i][j+1]}) + 1;
                    ans = max(ans, f[i+1][j+1]);
                }
 
            }
        }

        return ans * ans;
    }
};

参考

【图解】两种方法:动态规划/单调栈(Python/Java/C++/C/Go/JS/Rust)

看一遍就理解:动态规划详解

相关推荐
小O的算法实验室17 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
郭涤生18 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿18 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz18 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能18 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****18 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能18 小时前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能18 小时前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数
CoderCodingNo18 小时前
【GESP】C++四、五级练习题 luogu-P1177 【模板】排序
数据结构·c++·算法
Proxy_ZZ018 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法