算法第三次作业

对于数字三角形问题的动态规划分析

给定一个由n行数字组成的数字三角形,试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从当前位置向下或向右下移动)。由递归方程dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j] (1 < j < i);dp[i][1] = dp[i-1][1] + triangle[i][1] (第一列);dp[i][i] = dp[i-1][i-1] + triangle[i][i] (最后一列)。边界条件:dp[1][1] = triangle[1][1] (三角形顶部)。方程式说明:对于非边界位置(i,j),可以从左上(i-1,j-1)或正上(i-1,j)两个方向到达;边界位置只能从一个方向到达;每个位置的最大路径和等于上方两个可能来源中的较大值加上当前位置的值
填表法分析
表的维度:二维表格,大小为n×n,实际使用下三角部分,因为数字三角形只有下三角有值。填表范围:行范围:从第1行到第n行,列范围:第i行从第1列到第i列。填表顺序:从上到下逐行填充,每行从左到右逐列填充。原问题的最优值:原问题的最优值是最后一行中的最大值:max(dp[n][j]),其中j=1,2,...,n
复杂度分析
时间复杂度:需要填充n行,第i行有i个元素。总元素数:1+2+...+n = n(n+1)/2 = O(n²),每个元素计算需要常数时间O(1),总时间复杂度:O(n²)。
空间复杂度:基础实现需要存储整个dp表:O(n²)可优化为只存储前一行的值:O(n),最优空间复杂度:O(n)。
动态规划算法的理解与体会
动态规划是一种通过将复杂问题分解为相互重叠的子问题,并存储子问题解以避免重复计算的高效算法设计技术。其核心思想包括:最优子结构:问题的最优解包含其子问题的最优解重叠子问题:递归算法会反复求解相同的子问题。记忆化存储:通过表格存储已解决的子问题解。解决动态规划问题的关键步骤:定义状态:明确dp数组的含义,如dp[i][j]表示什么,确定状态转移方程:建立当前状态与之前状态的关系,初始化边界条件:确定最简单子问题的解,确定计算顺序:保证计算当前状态时所需的前置状态已计算,构造最优解:根据dp表反向追踪得到具体方案。
在数字三角形问题中的体会
通过解决数字三角形问题,我深刻体会到:从简单子问题开始,逐步构建复杂问题的解,避免了递归的重复计算,dp[i][j]定义为到达(i,j)的最大路径和,这种定义使得状态转移自然直观,空间优化的可能性:通过滚动数组等技术,可以将空间复杂度从O(n²)优化到O(n),问题分解的艺术:将复杂的最优路径问题分解为每个位置的最优子问题,体现了分治思想。动态规划主要解决问题包括:问题可以分解为相似的子问题;子问题之间存在重叠;需要求解最优值或计数类问题;问题规模较大,暴力搜索不可行。

posted @ 2025-11-16 18:40  manbout  阅读(2)  评论(0)    收藏  举报