【算法】动态规划思想

146 阅读2分钟

动态规划思想概述

动态规划(Dynamic Programming,简称DP)是一种在算法设计中广泛应用的优化技术,主要用于解决具有重叠子问题和最优子结构特性的问题。它的基本思想是将复杂问题分解为更小的子问题,并通过存储这些子问题的解来避免重复计算,从而提高效率。

动态规划的基本原理

动态规划的核心在于通过将原问题分解为若干个子问题,先求解子问题,再从这些子问题的解得到原问题的解。这种方法不仅适用于具有最优子结构性质的问题,还能有效解决子问题之间的重叠性问题

最优子结构
问题的最优解包含子问题的最优解。例如,计算斐波那契数列时,第n项依赖前两项的最优解,这种依赖关系体现了最优子结构

重叠子问题
子问题在分解过程中被重复计算。动态规划通过存储子问题的解(如使用数组或哈希表)避免冗余计算,例如斐波那契数列递归解法中存在大量重复计算,而动态规划可将其时间复杂度从指数级降至线性

无后效性
当前状态仅与前一阶段状态相关,与更早的决策无关。例如迷宫路径规划中,当前位置的下一步选择仅依赖当前坐标,而非如何到达此处

动态规划的应用步骤

  1. 判题:首先判断题目是否是在寻找一个问题的最优解。
  2. 分解问题:将大问题分解为更小的子问题,这些子问题之间可能存在重叠。
  3. 状态转移:找出子问题之间的关联,建立状态转移方程。
  4. 边界条件:讨论底层的边界问题,确保算法的正确性。
  5. 迭代求解:使用数组或其他数据结构进行迭代,求出最优解

动态规划与分治法、贪心法的比较

动态规划、分治法和贪心法都是解决复杂问题的有效方法,但它们各有特点:

方法特点适用场景
分治法子问题独立,无重叠,递归求解(如归并排序)。子问题无重叠的分解问题
贪心法每一步选择局部最优,不保证全局最优(如Dijkstra算法)。局部最优可推导全局最优的问题
动态规划存储子问题解,通过状态转移方程整合结果(如背包问题、最短路径)。具有重叠子问题和最优子结构的最优化问题