动态规划是一种通过将复杂问题分解为重叠子问题并存储子问题解来避免重复计算的优化算法。其核心在于最优子结构和重叠子问题两大性质,典型应用包括背包问题、最长公共子序列和最短路径等。通过自底向上或带记忆化的自顶向下递归实现,可显著降低时间复杂度。
【常见问题】
问题1:什么是dynamic programming中的重叠子问题?
回答1:重叠子问题指在递归求解过程中,同一个子问题被多次计算。dynamic programming通过缓存子问题的解(如数组或哈希表)来避免重复,从而提升效率。
问题2:dynamic programming与贪心算法的主要区别是什么?
回答2:dynamic programming考虑所有可能的子问题解并选择全局最优,而贪心算法仅基于当前局部最优做决策。dynamic programming适用于具有重叠子问题且无后效性的场景,贪心算法则要求局部最优能推导出全局最优。
问题3:如何判断一个实际问题是否适合用dynamic programming解决?
回答3:若问题可以分解为相互依赖的子问题,且子问题的解被多次复用(重叠子问题),同时整体最优解包含子问题的最优解(最优子结构),则适合采用dynamic programming。常见的判断方法是尝试写出递推关系式并验证是否满足上述性质。


