第三次作业

一、问题分析与动态规划求解步骤
1.1 递归方程式定义、边界条件(基于最优子结构)
该问题的核心是利用动态规划的最优子结构性质:从顶部到底部的最大路径和,可分解为 “当前元素 + 下一行左右两个位置到底部的最大路径和” 的最优选择。
状态定义:设 dp[i][j] 表示从第 i 行第 j 列元素到三角形底部的最大路径和。
递归方程式:dp[i][j] = arr[i][j] + max(dp[i+1][j], dp[i+1][j+1])。
解释:当前位置的最大路径和,等于当前元素值加上其下方左侧(i+1,j)和右侧(i+1,j+1)位置中最大的路径和。
边界条件:当 i = n-1(最后一行)时,dp[n-1][j] = arr[n-1][j](j 从 0 到 n-1)。
解释:最后一行元素到自身(底部)的路径和就是其本身,无后续元素可累加。
1.2 填表法的关键参数
表的维度:采用二维数组存储,维度为n×n。实际有效元素为第 i 行第 j 列(0≤i<n,0≤j≤i),其余位置未使用。
填表范围:所有有效元素,即 i 从 0 到 n-1,j 从 0 到 i。
填表顺序:从下往上逆向填充。
外层循环 i 从 n-2 到 0(从倒数第二行开始向上),内层循环 j 从 0 到 i(每行从左到右)。
原问题的最优值元素:dp[0][0]。dp[0][0] 对应从顶部(第 0 行第 0 列)到底部的最大路径和,直接作为最终输出。
1.3 算法复杂度分析
时间复杂度:O(n²)。外层循环执行 n-1 次(i 从 n-2 到 0),内层循环每行执行 i+1 次(j 从 0 到 i),总执行次数为 1+2+...+(n-1) = n(n-1)/2。
空间复杂度:O(n²)。代码使用二维数组 arr[n][n] 存储输入数据和子问题解,空间占用与 n² 成正比。
二、对动态规划算法的理解和体会
动态规划的本质是 “分解子问题 + 复用子解”,核心解决两类问题:一是 “重叠子问题”(不同原问题路径会重复经过同一子节点,需避免重复计算);二是 “最优子结构”(原问题的最优解可由子问题的最优解构造)。以数字三角形为例:从顶部到任意节点的路径可能有多种,但只需存储 “该节点到底部的最大路径和” 这一子解,无需重复计算所有路径;而每个节点的最优子解,又能通过其下方两个节点的最优子解推导得出。
数字三角形若用贪心算法(每次选择下方较大元素),可能因局部最优导致全局最优丢失(例如某一步选较小元素,但后续有更大累加和)。而动态规划通过遍历所有子问题的最优解,能确保最终结果是全局最优。此外,动态规划通过空间换时间,将暴力法 O(2ⁿ) 的指数级复杂度降至 O(n²),使 n=100 这类规模的问题能高效求解,体现了 “以空间换效率” 的算法设计思想。

posted @ 2025-11-18 16:25  那又怎样啊  阅读(6)  评论(0)    收藏  举报