递归:
1、分成子问题
2、停止条件
3、得到子问题之后的决策过程
4、不记录子问题的解
动态规划:
需要记录子问题的解
递归转为动态规划:(无后效性问题)
1、可变参数推出子空间维数
2、从调用看目标状态
3、从停止条件看初始状态
4、从递归函数分析普遍位置依赖
1、从矩阵的左上角走到右下角,只能往下和往右走,矩阵上的值代表代价,求最低代价。
递归:
matrix=[[1,3,2],[0,3,4],[5,7,1]]
def path(i,j,matrix):
if i==len(matrix)-1 and j==len(matrix[0])-1:
return matrix[i][j]
if i==len(matrix)-1 and j!=len(matrix[0])-1:
return matrix[i][j]+path(i,j+1,matrix)
if i!= len(matrix)-1 and j == len(matrix[0])-1:
return matrix[i][j] + path(i+1,j,matrix)
return matrix[i][j]+min(path(i,j+1,matrix),path(i+1,j,matrix))
print(path(0,0,matrix))
动态规划:
def dp_path(matrix):
row=len(matrix)
col=len(matrix[0])
dp= [[0] * col for i in range(row)]
dp[row-1][col-1]=matrix[row-1][col-1]
for i in range(col-2,-1,-1):
dp[row-1][i]=dp[row-1][i+1]+matrix[row-1][i]
for i in range(row-2,-1,-1):
dp[i][col-1]=dp[i+1][col-1]&#