第三周作业

动态规划法求解“数字三角形”问题实践报告

一、问题描述

数字三角形由n行数字组成,第i行(从1开始计数)有i个数字。从三角形顶部(第1行第1个数字)出发,每次只能向左下或右下方向移动到下一行数字,求从顶部走到底部的所有路径中,路径上数字之和的最大值。

二、动态规划求解步骤分析

2.1 最优子结构性质与递归方程式

2.1.1 最优子结构分析

设数字三角形第i行第j个元素为a[i][j](i、j均从1开始计数)。从a[i][j]出发到三角形底部的最大路径和记为dp[i][j]
要使dp[i][j]最大,下一步只能走到a[i+1][j]a[i+1][j+1],因此dp[i][j]的最优解必然包含dp[i+1][j]dp[i+1][j+1]的最优解,即问题具有最优子结构性质。

2.1.2 递归方程式定义

基于最优子结构,递归方程为:
dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1])
含义:从a[i][j]出发的最大路径和 = 当前元素值 + 下一行两个可达位置的最大路径和中的较大值。

2.1.3 边界条件

当到达三角形底部(i = n)时,路径无法继续延伸,此时路径和即为当前元素自身,边界条件为:
dp[n][j] = a[n][j](j从1到n)

2.2 填表法相关设计

2.2.1 表的维度

采用二维表格dp存储子问题最优解,维度为n×n(因第i行有i个元素,表格右下方部分无实际意义,可忽略)。其中dp[i][j]对应从第i行第j个元素到顶部的最大路径和。

2.2.2 填表范围

填表范围为i从n-1 downto 1(从倒数第二行向上遍历至第一行),j从1 to i(每行从第一个元素遍历至最后一个元素)。

2.2.3 填表顺序

采用从下往上的填表顺序:先计算底部行(边界条件),再依次计算倒数第二行、倒数第三行……直至第一行。每行内部按从左到右顺序填写,确保计算dp[i][j]时,dp[i+1][j]dp[i+1][j+1]已完成计算。

2.2.4 原问题最优值

原问题是求从顶部(a[1][1])到顶部的最大路径和,对应表格中dp[1][1]元素,即表格左上角元素。

2.3 算法时间与空间复杂度分析

2.3.1 时间复杂度

填表过程中,需遍历n-1行(从第1行到第n-1行),每行遍历i个元素(i从1到n-1),总运算次数为1+2+3+…+(n-1) = n(n-1)/2,时间复杂度为O(n²)

2.3.2 空间复杂度

若使用完整二维表格dp[n][n]存储子问题解,空间复杂度为O(n²)
优化方案:因计算第i行时仅需第i+1行的数据,可使用一维数组dp[j](长度为n),每次覆盖更新,空间复杂度可优化为O(n)

三、对动态规划算法的理解和体会

3.1 核心思想认知

动态规划的核心是“分解子问题、利用重叠子问题、依托最优子结构”:将原问题分解为规模更小的子问题,通过存储子问题的最优解避免重复计算,最终由子问题最优解推导出原问题最优解。数字三角形问题中,从顶部到底部的路径可分解为从下一行元素到顶部的路径,正是这一思想的体现。

3.2 适用场景总结

动态规划适用于具有最优子结构重叠子问题的问题:最优子结构保证子问题最优解能推导原问题最优解;重叠子问题则是动态规划提高效率的关键——若子问题不重叠,动态规划与分治法无本质区别。除数字三角形外,最长公共子序列、背包问题、最短路径问题等均是典型应用场景。

3.3 实践应用感悟

动态规划的难点在于定义子问题状态dp[i][j]和推导递归方程:状态定义需准确对应子问题核心,递归方程需贴合状态含义和最优子结构。初期容易陷入“从上往下”的递归思维(易导致重复计算),而“从下往上”的填表法更易落地实现。同时,空间优化的核心是发现“当前状态仅依赖有限个前序状态”,合理压缩存储规模。

posted @ 2025-11-12 20:12  麦明港  阅读(3)  评论(0)    收藏  举报