一般动态规划问题合集(Leetcode题解-Python语言)
生活随笔
收集整理的這篇文章主要介紹了
一般动态规划问题合集(Leetcode题解-Python语言)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比地球宽 15 倍,太阳惊现庞大黑子群
- 下一篇: iQOO12系列燃途版今天开售 起步51