1. 动态规划算法精要解析
动态规划(Dynamic Programming,简称DP)作为算法设计中的核心思想,在解决最优化问题时展现出强大的威力。其本质是通过将复杂问题分解为相互重叠的子问题,并存储子问题的解来避免重复计算。这种方法特别适用于具有最优子结构和重叠子问题特性的场景。
在实际应用中,动态规划通常表现为两种形式:自顶向下的记忆化搜索和自底向上的表格填充法。前者更符合人类思维习惯但递归开销较大,后者则通过迭代方式更高效地构建解空间。无论哪种形式,关键在于正确识别状态定义和状态转移方程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 三角形最小路径和问题详解
2.1 问题描述与状态定义
给定一个三角形数组,我们需要找到从顶部到底部的最小路径和。每次只能移动到下一行相邻的数字上。例如对于三角形:
code复制 [2],
[3,4],
[6,5,7],
[4,1,8,3]
]
最小路径和为2 + 3 + 5 + 1 = 11。
定义dp[i][j]为到达第i行第j列时的最小路径和。初始状态dp[0][0]自然就是三角形顶端的值。
2.2 状态转移方程推导
对于非首行的每个位置(i,j),它可以从两个方向到达:
- 正上方的(i-1,j)位置
- 左上方的(i-1,j-1)位置(当j>0时)
因此状态转移方程为:
code复制dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + triangle[i][j]
边界情况需要特殊处理:
- 每行第一个元素只能从正上方来
- 每行最后一个元素只能从左上方来
2.3 代码实现与优化
原始实现使用了一个二维DP数组,空间复杂度为O(n^2)。观察状态转移方程可以发现,当前行只依赖于上一行,因此可以优化为使用两个一维数组交替计算,将空间复杂度降为O(n)。
优化后的伪代码:
code复制prev_row = [triangle[0][0]]
for i from 1 to n-1:
curr_row = []
for j from 0 to i:
if j == 0:
min_val = prev_row[j]
elif j == i:
min_val
