第三次作业
一、动态规划法求解"数字三角形"问题步骤分析
问题描述
数字三角形由n行数字组成,第i行有i个数字。从三角形顶部出发,在每一层可以选择移动到下方或右下方的相邻数字,求从顶部到底部的路径中数字之和的最大值。
1.1 递归方程式(基于最优子结构)
状态定义:
设dp[i][j]表示从第i行第j列(行列索引从0开始)出发到达三角形底部的最大路径和。
最优子结构性质:
从位置(i,j)出发,下一步只能移动到(i+1,j)或(i+1,j+1),因此从(i,j)出发的最大路径和必然包含从这两个后继位置出发的路径和中较大的那个。
递归方程式:
text
dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1])
边界条件:
当处于最后一行时(i = n-1),路径终止:
text
dp[n-1][j] = triangle[n-1][j] (0 ≤ j ≤ n-1)
1.2 填表法细节
表的维度:
二维表dp,维度为n×n
有效元素范围:第i行有i+1个有效元素(0 ≤ j ≤ i)
填表范围:
行索引i:从n-1到0(自底向上)
列索引j:从0到i(每行从左到右)
填表顺序:
采用自底向上的顺序:
初始化最后一行(i = n-1)
依次计算第n-2, n-3, ..., 0行
每行内从左到右计算
原问题的最优值:
dp[0][0] - 表示从三角形顶部出发的最大路径和
1.3 时间和空间复杂度分析
时间复杂度:
需要填充的状态总数:1 + 2 + ... + n = n(n+1)/2
每个状态的计算:O(1)时间(一次加法、一次比较)
总时间复杂度:O(n²)
空间复杂度:
基础版本:O(n²)(存储整个dp表)
优化版本:O(n)(使用滚动数组,只存储当前行和下一行)
二、对动态规划算法的理解和体会
核心思想:
动态规划通过将复杂问题分解为相互重叠的子问题,利用最优子结构性质,通过存储子问题的解来避免重复计算,从而高效求解优化问题。
最优子结构:问题的最优解包含子问题的最优解
重叠子问题:递归求解时会重复遇到相同的子问题
实现关键:
状态定义:准确描述子问题的解的含义
状态转移方程:建立子问题之间的递推关系
边界条件:确定最小子问题的解
计算顺序:确保依赖的子问题先被计算
优势与局限:
优势:将指数级复杂度优化为多项式级,显著提高效率
局限:状态设计和转移方程推导需要较强的分析能力
本质理解:
动态规划是"以空间换时间"的典型范例,通过系统地记录和复用子问题的解,避免了重复计算,是解决复杂优化问题的有力工具。数字三角形问题很好地体现了动态规划的基本思想和实现步骤。
浙公网安备 33010602011771号