第三章作业
一 数字三角形问题的动态规划解法
1 问题分析
有个数字三角形,n行数字,从最上面走到最下面,每一步只能往左下或者右下走。要找一条路径,让路径上的数字加起来最大。
最优解就是那条和最大的路径,最优值就是那个最大的和。
这个问题可以拆成小问题,走到最下面某个点的最大路径,取决于走到它上面那些点的最大路径。
2 递推公式
用dp[i][j]表示从顶点走到第i行第j个位置的最大和。
一般情况:dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
开头的时候:dp[0][0] = triangle[0][0]
边界情况:
· 最左边的点(j=0):只能从右上过来,dp[i][0] = dp[i-1][0] + triangle[i][0]
· 最右边的点(j=i):只能从左上过来,dp[i][i] = dp[i-1][i-1] + triangle[i][i]
3 怎么算
搞个二维表dp,n行n列。
从上往下算,每一行从左往右算。
最后看看最下面一行哪个数最大,就是我们要的答案。
4 复杂度
时间O(n2),空间O(n2)
二 对动态规划的理解
动态规划核心思想就是把大问题拆成小问题,记住小问题的答案,避免重复计算。
它教我们系统性地分解问题,通过存中间结果来高效求解。关键是找到那个状态定义和递推关系。
其实就是用空间换时间,把指数复杂度降到多项式复杂度。