DAY 58 动态规划
发布人:shili8
发布时间:2025-01-12 10:03
阅读次数:0
**DAY58: 动态规划**
动态规划(Dynamic Programming)是一种常见的算法技巧,用于解决复杂的问题。它通过分解问题,找到子问题之间的重叠,并缓存已计算过的结果来提高效率。
###什么是动态规划?
动态规划是一种顶-down 的方法,它首先解决最小的子问题,然后逐渐合并这些子问题,以求出原来的问题的解。这种方法尤其适用于有重叠子问题的递归问题。
### 动态规划的步骤1. **分解问题**: 将原来的问题分解成多个子问题,每个子问题都可以独立解决。
2. **找到子问题之间的重叠**: 确定哪些子问题有重叠,这样我们就可以避免重复计算。
3. **缓存已计算过的结果**: 使用一个表格或数组来存储已经计算过的子问题的答案,以便下次遇到相同的问题时直接使用。
### 动态规划的优点1. **提高效率**: 动态规划可以避免重复计算,从而显著提高算法的效率。
2. **减少内存占用**: 只需要缓存已经计算过的结果,而不是所有可能的子问题,这样就能节省大量的内存。
### 动态规划的缺点1. **增加了空间复杂度**: 需要额外的空间来存储缓存的结果。
2. **需要仔细分析问题**: 才能确定哪些子问题有重叠,如何缓存结果。
### 实例:斐波那契数列斐波那契数列是一个经典的动态规划问题。斐波那契数列的第 n 个数字是前两个数字之和。
def fibonacci(n): # 创建一个表格来缓存结果 fib = [0] * (n +1) # 初始化第一行 fib[0] =0 fib[1] =1 # 计算斐波那契数列 for i in range(2, n +1): fib[i] = fib[i -1] + fib[i -2] return fib[n] # 测试函数print(fibonacci(10)) # 输出:55
### 实例:最长上升子序列最长上升子序列是另一个经典的动态规划问题。给定一个整数数组,找出其中最长的上升子序列。
def longest_ascending_subsequence(arr): # 创建一个表格来缓存结果 dp = [1] * len(arr) # 初始化第一行 for i in range(1, len(arr)): for j in range(i): if arr[i] > arr[j]: dp[i] = max(dp[i], dp[j] +1) return max(dp) # 测试函数arr = [10,22,9,33,21,50,41,60] print(longest_ascending_subsequence(arr)) # 输出:6
### 总结动态规划是一种常见的算法技巧,用于解决复杂的问题。它通过分解问题,找到子问题之间的重叠,并缓存已计算过的结果来提高效率。动态规划有很多优点,如提高效率和减少内存占用,但也有一些缺点,如增加了空间复杂度和需要仔细分析问题。
在本文中,我们使用Python语言演示了斐波那契数列和最长上升子序列的动态规划实现。这些例子展示了如何使用动态规划来解决实际的问题,并且可以作为学习动态规划技巧的参考。