1、不同路径
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
#初始化dp
dp = [[1]*n for _ in range(m)]
#从第一行第一列开始遍历
for i in range(1,m):
for j in range(1,n):
#当前格子的路径数来自于左边和上面的格子
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[m-1][n-1]
2、不同路径II
class Solution:
def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
if not obstacleGrid or not obstacleGrid[0]:
return 0
dp = [[0] * len(obstacleGrid[0]) for _ in range(len(obstacleGrid))]
#初始化第0行和第0列的dp
for i in range(len(dp)):
if obstacleGrid[i][0] == 1:
break
dp[i][0] = 1
for i in range(len(dp[0])):
if obstacleGrid[0][i] == 1:
break
dp[0][i] = 1
#从第一行第一列开始遍历dp
for i in range(1,len(dp)):
for j in range(1,len(dp[0])):
# 如果遇到障碍格子,或者被障碍格包围了,continue
if obstacleGrid[i][j] == 1:
continue
if obstacleGrid[i-1][j] == 1 and obstacleGrid[i][j-1] == 1:
continue
#一边是障碍格子的情况
elif obstacleGrid[i-1][j] == 1:
dp[i][j] = dp[i][j-1]
elif obstacleGrid[i][j-1] == 1:
dp[i][j] = dp[i-1][j]
#旁边没有障碍的情况
else:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[-1][-1]
3、整数拆分
class Solution:
def integerBreak(self, n: int) -> int:
dp = [0]*(n+1)
dp[2] = 1
# 从3开始遍历到n
for i in range(3,n+1):
for j in range(2,i//2+2): # i//2+2表示i//2向上取整(+1),并且是<=(再+1)
# max中,第一项表示拆成两个数相乘的值,第二项表示拆成多个数相乘的值
# 第三项保证每个循环遍历的时候都能取到最大值
dp[i] = max(j * (i-j), j*dp[i-j], dp[i])
return dp[n]