算法第三次作业
一、动态规划法求解 “数字三角形” 问题分析
1.1 根据最优子结构性质,列出递归方程式,说明方程式的定义、边界条件
变量定义
设数字三角形有 n 层,二维数组 a[i][j] 存储第 i 层第 j 个元素(i、j 从 0 开始计数,0≤j≤i≤n-1)。定义 dp[i][j] 表示从第 i 层第 j 个元素出发,到达最底层的路径数字之和的最大值。
递归方程式
dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1])
边界条件
当 i = n-1(最底层)时,路径仅包含当前元素,故 dp[n-1][j] = a[n-1][j](0≤j≤n-1)。
1.2 给出填表法中表的维度、填表范围和填表顺序。以及原问题的最优值是哪个表格元素
表的维度
dp 表为 n×n 二维数组(与数字三角形维度一致,有效元素范围 0≤j≤i≤n-1)。
填表范围
i 从 n-1 到 0 遍历,j 从 0 到 i 遍历(第 i 层有 i+1 个有效元素)。
填表顺序
从最底层(i = n-1)向上逐层填充,直至顶层(i = 0);同一层内 j 按从左到右顺序填充。
原问题的最优值
对应 dp[0][0](从顶层出发到最底层的最大路径和)。
1.3 分析该算法的时间和空间复杂度
时间复杂度
有效元素总数为 1+2+...+n = n(n+1)/2,每个元素仅计算一次。
每个元素计算包含 1 次加法和 1 次取最大值操作,时间复杂度 O(1)。
整体时间复杂度为 O(n²)。
空间复杂度
dp 数组为 n×n 维度,空间复杂度 O(n²)。
优化方案:利用 “当前层计算仅依赖下一层数据” 的特性,用一维数组滚动存储,空间复杂度可优化至 O(n)。
二、对动态规划算法的理解和体会
动态规划算法的核心思想是 “拆分复杂问题为子问题、存储子问题结果、避免重复计算”。
求解数字三角形问题有两大核心特性:
一是最优子结构,原问题的最优解必然由子问题的最优解推导而来,比如顶层元素的最大路径和,一定是自身值加上下一层相邻两个元素的最大路径和之一。
二是重叠子问题,暴力递归会反复计算同一子路径的和,而动态规划通过表格存储中间结果,让每个子问题仅计算一次,大幅提升效率。
动态规划的解题步骤具有明确的规律性:先定义清晰的状态(如 dp[i][j] 的含义),再根据最优子结构推导递归方程式,明确边界条件,最后通过填表法得到结果。这种结构化思路能将复杂的路径最优问题拆解为可逐步解决的小问题,适用性极强。
同时我发现,动态规划的空间复杂度往往有优化空间。比如数字三角形问题,通过一维数组滚动存储下一层数据,可将空间复杂度从 O(n²) 降至 O(n),这体现了 “用空间换时间” 的权衡思想,也让我明白算法设计中需兼顾时间与空间效率。
动态规划不仅是一种算法,更是一种解决最优问题的思维方式。它教会我面对复杂问题时,不急于求成,而是通过拆分、存储、复用的思路,高效找到最优解,这一思维在路径规划、资源分配等诸多场景中都能发挥重要作用。
浙公网安备 33010602011771号