第三次作业
- 实践报告:数字三角形的动态规划分析
1.1 递归方程式、定义及边界条件
• 定义:设dp[i][j]表示从数字三角形的第i行第j列元素出发,到达最底层的最大路径和。
• 递归方程式:dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1])
• 边界条件:当i为最后一行时,dp[i][j] = triangle[i][j](因为已经到达底层,路径和就是自身元素值)。
1.2 填表法的表维度、填表范围、填表顺序及最优值位置
• 表的维度:二维表,维度为n×n(n为数字三角形的行数)。
• 填表范围:所有i(从n-1到0)和j(从0到i)的dp[i][j]。
• 填表顺序:从最后一行开始,向上逐行填表;每行内从左到右填表。
• 原问题的最优值位置:dp[0][0](从三角形顶部出发的最大路径和)。
1.3 时间和空间复杂度分析
• 时间复杂度:需要填充n×n的表格,每个元素的计算时间为O(1),因此时间复杂度为O(n²)(n为数字三角形的行数)。
• 空间复杂度:使用二维数组存储dp表,空间复杂度为O(n²)。若进行空间优化(例如使用一维数组从后往前更新),空间复杂度可优化至O(n)。
- 对动态规划算法的理解和体会
动态规划算法的核心在于最优子结构和重叠子问题这两个关键性质。
• 最优子结构体现为原问题的最优解包含子问题的最优解,这使得我们可以通过递推的方式从子问题的解构建原问题的解,如“数字三角形”中每个位置的最优路径和依赖于其下方两个位置的最优路径和。
• 重叠子问题则是指在求解过程中,多个子问题会被重复计算,动态规划通过存储子问题的解(即填表)来避免重复计算,从而大幅提高效率,这与递归(尤其是暴力递归)有明显区别,递归可能会对同一子问题进行多次计算,导致时间复杂度急剧上升。
在应用动态规划时,通常遵循“定义状态→推导状态转移方程→确定边界条件→填表求解”的步骤。它适用于多种优化问题,如最短路径、背包问题等。其优势在于能将指数级复杂度的问题优化到多项式级别,劣势则是有时状态定义和转移方程的推导较为困难,且需要额外的空间存储子问题的解。通过学习动态规划,能深刻体会到“以空间换时间”的算法设计思想,也能培养从子问题入手分析复杂问题的思维方式。
浙公网安备 33010602011771号