代码随想录算法训练营第三十四天 |动态规划part02
62 不同路径
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
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 整数拆分
-
确定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])