Python 实例详解
1. 斐波那契数列
def fibonacci_recursive(n):if n <= 1:return nreturn fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
def fibonacci_dp(n):if n <= 1:return ndp = [0] * (n + 1)dp[0] = 0dp[1] = 1for 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 nprev2, prev1 = 0, 1for i in range(2, n + 1):current = prev1 + prev2prev2, prev1 = prev1, currentreturn 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 -1
print(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] = ifor j in range(n + 1):dp[0][j] = jfor 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 0dp = [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 bisecttails = []for num in nums:pos = bisect.bisect_left(tails, num)if pos == len(tails):tails.append(num)else:tails[pos] = numreturn 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 0dp = [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_sum
def max_subarray_optimized(nums):if not nums:return 0max_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. 游戏开发
5. 网络通信
- 路由算法:网络数据包的最优路径选择
- 数据压缩:文件压缩算法优化
动态规划解题模板
def dynamic_programming_solution(problem):