第三次作业

一、动态规划法求解 “数字三角形”

1.1 递归方程式及边界条件问题描述数字三角形由 n 行数字组成,第 i 行(从 0 开始计数)有 i+1 个数字,记为triangle[i][j](0≤j≤i)。

从顶部(第 0 行第 0 列)出发,每次只能向下(i+1,j)或向右下(i+1,j+1)移动,求到达底部(第 n-1 行)的路径上数字之和的最大值。
最优子结构性质设dp[i][j]表示从第 i 行第 j 列元素出发,到达底部的最大路径和。
对于第 i 行第 j 列的元素,其下一步只能移动到第 i+1 行第 j 列或第 i+1 行第 j+1 列,因此该位置的最优解依赖于这两个位置的最优解。
递归方程式:(dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]))
边界条件当到达最后一行(i = n-1)时,没有后续路径,因此路径和即为自身:(dp[n-1][j] = triangle[n-1][j]

1.2 填表法细节表的维度采用二维表格dp存储子问题的最优解,维度为n×n(n 为三角形的行数)。

其中,第 i 行有效列范围为 0≤j≤i(与三角形结构一致)。填表范围需要填充表格中所有有效位置,即对于每一行 i(从 0 到 n-1),填充列 j(0≤j≤i)。
填表顺序由于dp[i][j]依赖于下一行的dp[i+1][j]和dp[i+1][j+1],
因此填表顺序为自底向上:先填充最后一行(i = n-1):直接根据边界条件赋值dp[n-1][j] = triangle[n-1][j];
从第 n-2 行向上依次填充到第 0 行,每行从左到右(或从右到左,因同一行元素无依赖关系)计算dp[i][j]。
原问题的最优值原问题要求从顶部(第 0 行第 0 列)出发的最大路径和,因此最优值为表格的dp[0][0]。

1.3 算法的时间和空间复杂度时间复杂度
表格中共有1 + 2 + ... + n = n(n+1)/2个有效元素,每个元素的计算仅需一次比较和加法操作(O (1))。
总时间复杂度为O(n²)。空间复杂度若使用二维数组dp存储所有子问题解,空间复杂度为O(n²)。
优化:由于计算第 i 行时仅依赖第 i+1 行的结果,可使用一维数组滚动更新(仅保留当前行和下一行),空间复杂度可优化至O(n)。

二、对动态规划算法的理解和体会
动态规划(Dynamic Programming, DP)是一种通过存储子问题的最优解来高效求解复杂问题的方法,其核心思想可概括为 “避免重复计算,利用子问题最优解”。
核心要素:

1.重叠子问题:问题的解包含多个重复的子问题(如数字三角形中,不同路径可能经过同一位置,需重复计算该位置的最大路径和)。动态规划通过表格存储子问题解,将 “重复计算” 转化为 “查表”,大幅减少计算量。

2.最优子结构:问题的最优解可由子问题的最优解推导得出(如数字三角形中,父节点的最优路径和依赖子节点的最优路径和)。这是动态规划能够递归定义的基础。
与递归的区别:递归(自顶向下)可能因重复计算子问题导致效率极低(如数字三角形的朴素递归时间复杂度为 O (2ⁿ));而动态规划(自底向上)通过填表主动计算并存储子问题解,将指数级复杂度降至多项式级(如 O (n²)),体现了 “以空间换时间” 的策略。

实践体会:求解动态规划问题的关键是 “定义状态” 和 “推导转移方程”。状态定义需准确捕捉子问题的核心信息(如dp[i][j]的定义),转移方程需清晰描述子问题间的依赖关系。此外,空间优化(如滚动数组)在实际应用中能有效降低内存开销,体现了动态规划的灵活性。

总之,动态规划是解决具有重叠子问题和最优子结构问题的 “利器”,其思想不仅适用于算法题,也能指导实际工程中复杂问题的拆解与优化。

posted @ 2025-11-16 01:08  起剑  阅读(0)  评论(0)    收藏  举报