文章目录
62.不同路径
dp是每个各自的路径的和,每个格子的路径是左边格子和上边格子的和。这里初始化的时侯假设所有格子都只有一条路径,然后遍历所有格子,如果i-1和j-1大于0则可以把对应格子的值加上。
python
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
dp = [[1 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
if i > 0 and j > 0:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
elif i > 0:
dp[i][j] = dp[i-1][j]
elif j > 0:
dp[i][j] = dp[i][j-1]
return dp[-1][-1]
63.不同路径II
和上一题相比如果格子有阻挡把他赋值为0,别的一样。
python
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
m = len(obstacleGrid)
n = len(obstacleGrid[0])
dp = [[1 for _ in range(n)] for _ in range(m)]
for i in range(m):
for j in range(n):
if obstacleGrid[i][j]:
dp[i][j] = 0
else:
if i > 0 and j > 0:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
elif i > 0:
dp[i][j] = dp[i-1][j]
elif j > 0:
dp[i][j] = dp[i][j-1]
return dp[-1][-1]
343.整数拆分
dp表示的是数字i的最大的整数拆分值,用for对每一个i再拆分成两个数字,递推公式是在dp[i]和j*(i-j)和j*dp[i-j]中选最大的,第一个是记录当前的最大整数拆分值,第二个是这个数字i在减去j拆分成两个数字的乘积,第三项是j和(i-j)的最大整数拆分的乘积(包括了拆分成多个数字的可能性)。
python
class Solution:
def integerBreak(self, n: int) -> int:
dp = [1 for _ in range(n+1)]
for i in range(3, n+1):
for j in range(1, i):
dp[i] = max(dp[i], j * (i - j), dp[i-j]*j)
return dp[n]
96.不同的二叉搜索树
dp内容是值为i的时候的二叉搜索树的可能个数,值为i时,他可能的二叉搜索树是从1到i的所有元素作为根节点的树相加的,对于每一个作为根节点的元素j,他的可能搜索二叉树由小于j的元素[j-1]的dp值构成左子树,由大于j的元素[i-j]的dp值构成右子树,则根节点为j的树的dp值为左右子树的dp值相乘。
python
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n+1)
dp[0] = 1
for i in range(1, n+1):
for j in range(1,i+1):
dp[i] += dp[j-1] * dp[i-j]
return dp[-1]