118. 杨辉三角

class Solution:def generate(self, numRows: int) -> List[List[int]]:dp = [[0] * i for i in range(1, numRows+1)]for i in range(numRows):for j in range(len(dp[i])):# 左右两边是1,中间部分就是其上方两个数之和if j == 0 or j == i:dp[i][j] = 1else: dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]return dp

杨辉三角其实就是利用递推思想建立的,从上一层的数值得到下一层数值。因此可以利用动态规划,每层最左边和右边的元素都是1,而中间的元素由上一层的两个元素求和得到。

119. 杨辉三角 II

class Solution:def getRow(self, rowIndex: int) -> List[int]:dp = [[0] * i for i in range(1, rowIndex+2)]for i in range(rowIndex+1):for j in range(len(dp[i])):# 左右两边是1,中间部分就是其上方两个数之和if j == 0 or j == i:dp[i][j] = 1else: dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]return dp[-1]

与上一题一样,只是要求单层的元素而已。

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

class Solution:def countSquares(self, matrix: List[List[int]]) -> int:m, n = len(matrix), len(matrix[0])dp = [[0] * n for _ in range(m)]ans = 0for i in range(m):for j in range(n):if i == 0 or j == 0:dp[i][j] = matrix[i][j]elif matrix[i][j] == 0:dp[i][j] = 0else:dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1ans += dp[i][j]return ans

思路是用 dp[i][j] 表示以 (i, j) 为右下角的正方形的最大边长,然后用动态规划得到所有位置的值,过程中用 ans 记录所有边长的总数(即为正方形子矩阵的总数)。关键是求出状态转移方程,求法见官方题解。

221. 最大正方形

class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:m, n = len(matrix), len(matrix[0])dp = [[0] * n for _ in range(m)]ans = 0for i in range(m):for j in range(n):if i == 0 or j == 0:dp[i][j] = int(matrix[i][j])elif int(matrix[i][j]) == 0:dp[i][j] = 0else:dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1if dp[i][j] > ans:ans = dp[i][j]return ans ** 2

与上一题类似,这里只需要记录最大的正方形边长,则最大的正方形面积就是边长求平方。

一般动态规划问题合集(Leetcode题解-Python语言)相关推荐

  1. 爬楼梯与路径类题目记忆化递归与动态规划双解法(Leetcode题解-Python语言)

    70. 爬楼梯(剑指 Offer 10- II. 青蛙跳台阶问题) 递归(英语:Recursion),是指在函数的定义中使用函数自身的方法.有意义的递归通常会把问题分解成规模缩小的同类子问题,当子问题 ...

  2. 回溯的问题合集(Leetcode题解-Python语言)

    78. 子集 class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:ans = []cur = []def d ...

  3. 矩阵模拟问题合集(Leetcode题解-Python语言)

    54. 螺旋矩阵(剑指 Offer 29. 顺时针打印矩阵) class Solution:def spiralOrder(self, matrix: List[List[int]]) -> L ...

  4. 买卖股票类问题动态规划解法(Leetcode题解-Python语言)

    在 Leetcode 中,关于买卖股票的问题共有6道,而这些题目是可以用相同的思维进行求解的,强烈推荐这篇总结,写得非常到位. 股票类问题的动态规划分三步走,1.首先明确方程的含义, T[i][k][ ...

  5. 子串、子数组与子序列类型问题的动态规划求解(Leetcode题解-Python语言)

    一般来说,子串和子数组都是连续的,而子序列是可以不连续的,遇到子序列问题基本上都是用动态规划求解. 53. 最大子数组和(剑指 Offer 42. 连续子数组的最大和) class Solution: ...

  6. 哈希表(散列表)基础概念与经典题目(Leetcode题解-Python语言)之中——实际应用

    上一节介绍了哈希表的原理与设计方法,这一节则直接python中现有的哈希表类型:哈希集合 set(集合)和哈希映射 dict(字典)来解决实际应用(刷题). 零.概念 在介绍实际应用之前,有一个概念我 ...

  7. 二叉树层序遍历(广度优先搜索)基础概念与经典题目(Leetcode题解-Python语言)

    二叉树的广度优先搜索即从上到下.从左到右地进行搜索,对于层序遍历(Level Order)问题,即依次遍历第一层节点.第二层节点-等,基本可以秒杀. 广度优先搜索是通过队列来实现的,python中优先 ...

  8. 两数、三数、四数之和相关题目(Leetcode题解-Python语言)

    作为 Leetcode 的第一题,两数之和自然是知名度最高的,从两数之和出发也有不少的衍生题目,下面就让我们好好地解决它们. 1. 两数之和 class Solution:def twoSum(sel ...

  9. 字符串匹配经典题目——KMP算法(Leetcode题解-Python语言)

    28. 实现 strStr() strStr(haystack: str, needle: str) 的作用就是在 haystack 字符串(长度为 n)中找出 needle 字符串(长度为 m)出现 ...

最新文章

  1. java domain层_java框架中的controller层、dao层、domain层、service层、view层
  2. python mysql链接安全_Python最佳实践和最安全的方法来连接MySQL和执行查询
  3. 隐藏导航栏或返回按钮
  4. 29. ExtJs - Struts2 整合(1) - 登录页面
  5. JS全选功能代码优化
  6. C/C++ 文件读写操作总结
  7. 什么是SQL Server TRIM()函数?
  8. 利用计算机进行频数分布表制作,excel制作交叉分组表,excel分组频数分布表
  9. 金字塔固定资产管理软件_目前常用固定资产管理软件有哪些?
  10. NOIP2018 复赛提高组一等奖获奖名单
  11. Netbeans使用问题整理
  12. PHP微信扫码关注公众号并登录
  13. Oracle递归死循环怎么办?
  14. 虚拟机:centos在主机和虚拟机之间传输文件
  15. Oracle 报错:ORA-01438: 值大于为此列指定的允许精度
  16. arcgis api for javascript4.18加载天地图服务,并且加载自己的发布的动态地图服务
  17. android 解锁图案代码,Android图案解锁code.docx
  18. ERR_UNSAFE_PORT浏览器安全问题无法访问的解决方案
  19. 护士排班问题matlab,护士排班,该听谁的?聪明的护士长都这样做!
  20. UIUX17个小技巧合集

热门文章

  1. [转]后端程序员必备:书写高质量SQL的30条建议
  2. C语言试题三十七之求除一个2×m整型二维数组中最大元素的值,并将此值返回调用函数。
  3. linux之彻底卸载mysql
  4. 数据结构之广度优先搜索(队列实现)问题
  5. Android系统手机端抓包方法(tcpdump)
  6. 判断一个字符串是否包含另一个字符串(用java但是不能用index()这个函数)
  7. Android之给gridview的单元格加上分割线
  8. python 全解坦克大战 辅助类 附完整代码【雏形】
  9. 软件项目组织管理(七)项目成本管理
  10. sql 某列数据全部为0则不显示该列_数据产品经理养成记(五):汇总分析