Python 实例详解
1. 斐波那契数列
def fibonacci_recursive(n): if n <= 1: return n return fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)def fibonacci_dp(n): if n <= 1: return n dp = [0] * (n + 1) dp[0] = 0 dp[1] = 1 for i in range(2, n + 1): dp[i] = dp[i - 1] + dp[i - 2] return dp[n]def fibonacci_optimized(n): if n <= 1: return n prev2, prev1 = 0, 1 for i in range(2, n + 1): current = prev1 + prev2 prev2, prev1 = prev1, current return prev1
2. 硬币找零问题
def coin_change(coins, amount): dp = [float(\'inf\')] * (amount + 1) dp[0] = 0 for i in range(1, amount + 1): for coin in coins: if coin <= i: dp[i] = min(dp[i], dp[i - coin] + 1) return dp[amount] if dp[amount] != float(\'inf\') else -1print(coin_change([1, 3, 4], 6))
3. 编辑距离问题
def min_distance(word1, word2): m, n = len(word1), len(word2) dp = [[0] * (n + 1) for _ in range(m + 1)] for i in range(m + 1): dp[i][0] = i for j in range(n + 1): dp[0][j] = j for i in range(1, m + 1): for j in range(1, n + 1): if word1[i - 1] == word2[j - 1]: dp[i][j] = dp[i - 1][j - 1] else: dp[i][j] = min( dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1 ) return dp[m][n]
4. 最长递增子序列
def length_of_lis(nums): if not nums: return 0 dp = [1] * len(nums) for i in range(1, len(nums)): for j in range(i): if nums[j] < nums[i]: dp[i] = max(dp[i], dp[j] + 1) return max(dp)def length_of_lis_optimized(nums): import bisect tails = [] for num in nums: pos = bisect.bisect_left(tails, num) if pos == len(tails): tails.append(num) else: tails[pos] = num return len(tails)
5. 背包问题
def knapsack(weights, values, capacity): n = len(weights) dp = [[0] * (capacity + 1) for _ in range(n + 1)] for i in range(1, n + 1): for w in range(capacity + 1): dp[i][w] = dp[i - 1][w] if w >= weights[i - 1]: dp[i][w] = max( dp[i][w], dp[i - 1][w - weights[i - 1]] + values[i - 1] ) return dp[n][capacity]def knapsack_optimized(weights, values, capacity): n = len(weights) dp = [0] * (capacity + 1) for i in range(n): for w in range(capacity, weights[i] - 1, -1): dp[w] = max(dp[w], dp[w - weights[i]] + values[i]) return dp[capacity]
6. 最大子数组和
def max_subarray(nums): if not nums: return 0 dp = [0] * len(nums) dp[0] = nums[0] max_sum = dp[0] for i in range(1, len(nums)): dp[i] = max(nums[i], dp[i - 1] + nums[i]) max_sum = max(max_sum, dp[i]) return max_sumdef max_subarray_optimized(nums): if not nums: return 0 max_sum = nums[0] current_sum = nums[0] for i in range(1, len(nums)): current_sum = max(nums[i], current_sum + nums[i]) max_sum = max(max_sum, current_sum) return max_sum
实际应用场景
1. 计算机科学领域
- 算法优化:在递归算法中避免重复计算
- 字符串处理:文本编辑器的差异比较、拼写检查
- 图形处理:图像压缩、模式识别
- 编译器设计:语法分析、代码优化
2. 业务应用
- 资源分配:项目管理中的任务调度
- 金融领域:投资组合优化、风险评估
- 电商推荐:个性化推荐系统
- 物流运输:路径规划、库存管理
3. 生物信息学
- DNA序列比对:基因序列相似性分析
- 蛋白质结构预测:生物分子结构分析
4. 游戏开发
- AI决策:游戏中的路径寻找
- 关卡设计:难度平衡计算
5. 网络通信
- 路由算法:网络数据包的最优路径选择
- 数据压缩:文件压缩算法优化
动态规划解题模板
def dynamic_programming_solution(problem):