动态规划解析:从数塔到最长有序子序列

需积分: 9 13 下载量 119 浏览量 更新于2024-07-13 收藏 505KB PPT 举报
"子结构特征-动态规划入门" 动态规划是一种强大的算法思想,常用于解决最优化问题,通过将复杂问题分解成更小的子问题来求解。在这个主题中,我们将探讨动态规划的基本概念,特别是子结构特征,并通过一些经典问题来深化理解。 动态规划的核心在于子结构和最优子结构的概念。子结构意味着原问题的解可以由其子问题的解构造而来,而最优子结构是指原问题的最优解包含子问题的最优解。在描述的子结构特征中,我们看到公式 `f(i,j)` 描述了一个状态,通常表示两个序列 a 和 b 在位置 i 到 j 的子序列之间的某种性质,如最长公共子序列、最长递增子序列等。 1. **最长公共子序列(LCS)**:给定两个序列 a 和 b,LCS 是一个序列,它是 a 和 b 的非降序子序列,且长度最长。这里的 `f(i,j)` 表示 a[0:i] 和 b[0:j] 的 LCS 长度。根据描述中的规则,`f(i-1,j-1)+1` 当 `a[i]==b[j]` 时,表示当前字符匹配,LCS 长度加一;而 `max(f(i-1,j),f(i,j-1))` 当 `a[i]!=b[j]` 时,表示当前字符不匹配,取之前一步的最大值。 2. **数塔问题**:这是一个经典的动态规划问题,目标是找到从数塔顶部到底部的最大路径和。暴力解决方法效率低下,因为随着层数增加,路径数量呈指数增长。动态规划策略是从底部向上计算,对于每个节点,我们可以计算向左或向右走所能达到的最大值,然后选择较大者作为当前节点的最大值。 3. **最长有序子序列**:这个问题中,给定一个序列 `Num[I]`,我们要找最长的非降序子序列。动态规划表 `F[I]` 中的 `F[i]` 表示以 `Num[i]` 结尾的最长有序子序列的长度。我们可以通过比较 `Num[i]` 与前一个元素的大小来更新 `F[i]` 的值。 4. **其他应用**:题目中还提到了其他问题,如 FatMouse's Speed 和 SuperJumping!,这些都是动态规划可以解决的问题。前者可能涉及到最短路径问题,后者可能需要找出跳跃次数最少的路径,这些问题都可以通过构建适当的状态转移方程来解决。 动态规划的关键在于找到合适的状态表示和状态转移方程,以及确定问题是否有重叠子问题和最优子结构。通过定义这些关键要素,我们可以用动态规划高效地解决各种复杂问题。学习动态规划不仅有助于解决竞赛编程中的问题,也是软件开发、数据分析等领域的重要工具。