代码随想录算法训练营第三十四天 |动态规划part02

89 阅读2分钟

代码随想录算法训练营第三十四天 |动态规划part02

62 不同路径

image-20250112213829153.png

m=3
n=7
# dp[i][j] = 到达第i行第j列 有dp[i][j]种方法
dp = [[0 for i in range(n)] for j in range(m)]
# 设置第一行和第一列的基本情况
for i in range(m):
    dp[i][0] = 1
for j in range(n):
    dp[0][j] = 1
for i in range(1,m):
    for j in range(1,n):
        dp[i][j] = dp[i-1][j] + dp[i][j-1]
print(dp[m-1][n-1])

63 不同路径II

image-20250112213854715.png

m = 2
n = 2
obstacleGrid = [[0,0],[1,0]]
dp = [[0 for i in range(n)] for j in range(m)]
dp[0][0] = 1
# 设置第一行的基本情况
for i in range(1,m):
    if obstacleGrid[i][0] == 0:
        dp[i][0] = dp[i-1][0]
# 设置第一列的基本情况
for j in range(1,n):
    if obstacleGrid[0][j] == 0:
        dp[0][j] = dp[0][j-1]
for i in range(1,m):
    for j in range(1,n):
        if obstacleGrid[i][j] == 1:
            dp[i][j] = 0
        else:
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
print(dp[m-1][n-1])

343 整数拆分

image-20250112213906259.png

  • 确定dp数组以及下标的含义

    • dp[i]: i 拆分之后得到最大的乘积 为dp[i]
  • 递推公式

    • 对i拆成2个数 : j * (i-j)
    • 对i拆成3个数及以上 : j * dp[i-j]
  • dp数组如何初始化

    • dp[0] = 0
    • dp[1] = 0
    • dp[2] = 1
  • 遍历顺序

    • for i in range(3,n+1):

      for j in range(1,j//2 + 1):

      dp[i] = max(j×(i-j),j×dp[i-j], dp[i])

  • 打印dp数组

    • return dp[n]
n = 10
dp = [0] * (n + 1)
dp[2] = 1
for i in range(3, n + 1):
    for j in range(1,i//2+1):
         # 计算切割点j和剩余部分(i-j)的乘积,并与之前的结果进行比较取较大值
        dp[i] = max(j*(i-j),j*dp[i-j],dp[i])
print(dp[n])

96 不同的二叉搜索树(一刷跳过)

image-20250112213914558.png