当前位置:实例文章 » 其他实例» [文章]dp算法篇Day8

dp算法篇Day8

发布人:shili8 发布时间:2025-01-11 20:35 阅读次数:0

**DP算法篇 Day8**

在前面的几天里,我们已经学习了DP算法的基本概念、动态规划表格的建立以及如何使用DP解决一些经典的问题。今天,我们将继续深入探讨DP算法的应用,特别是关于背包问题和最长上升子序列问题。

**1. 背包问题**

背包问题是一种经典的DP问题,它涉及到在一个背包中放入尽可能多的物品,而这些物品的重量和价值都有所限制。我们可以将其视为一种0-1背包问题,即每个物品只能被放入一次。

**背包问题的数学描述**

假设我们有 n 个物品,每个物品的重量为 w_i 和价值为 v_i。我们希望在一个容量为 W 的背包中放入尽可能多的物品,使得总价值最大化。

**DP算法解决背包问题**

为了解决这个问题,我们可以使用以下DP表格:

| |0 |1 |2 | ... | n |
| --- | --- | --- | --- | ... | --- |
|0 |0 |0 |0 | ... |0 |
|1 |0 | v_1 | | ... | |
|2 |0 | | v_1 + v_2 | ... | |
| ... | ... | ... | ... | ... | ... |
| n |0 | | | ... | max(v_1, v_2, ..., v_n) |

其中,dp[i][j] 表示在前 i 个物品中放入重量为 j 的背包的最大价值。

**代码实现**

def knapsack(W, wt, val, n):
 K = [[0 for w in range(W +1)] for i in range(n +1)]

 # Build table K[][] in bottom up manner for i in range(n +1):
 for w in range(W +1):
 if i ==0 or w ==0:
 K[i][w] =0 elif wt[i -1] <= w:
 K[i][w] = max(val[i -1] + K[i -1][w - wt[i -1]], K[i -1][w])
 else:
 K[i][w] = K[i -1][w]

 return K[n][W]


# Driver codeval = [60,100,120]
wt = [10,20,30]
W =50n = len(val)

print(knapsack(W, wt, val, n))


**2. 最长上升子序列问题**

最长上升子序列问题是一种经典的DP问题,它涉及到在一个给定的序列中找到一个长度最大的上升子序列。

**最长上升子序列问题的数学描述**

假设我们有一个长度为 n 的序列,序列中的每个元素都有一个值。我们希望找到一个长度最大的上升子序列,使得该子序列中每两个连续元素的值都大于前一个元素。

**DP算法解决最长上升子序列问题**

为了解决这个问题,我们可以使用以下DP表格:

| |0 |1 |2 | ... | n |
| --- | --- | --- | --- | ... | --- |
|0 |0 |0 |0 | ... |0 |
|1 |0 |1 | | ... | |
|2 |0 | |2 | ... | |
| ... | ... | ... | ... | ... | ... |

其中,dp[i] 表示序列中前 i 个元素的最长上升子序列长度。

**代码实现**

def longest_ascending_sequence(arr):
 n = len(arr)
 dp = [1] * n for i in range(1, n):
 for j in range(i):
 if arr[i] > arr[j]:
 dp[i] = max(dp[i], dp[j] +1)

 return max(dp)


# Driver codearr = [10,22,9,33,21,50,41,60]
print(longest_ascending_sequence(arr))


以上就是今天关于DP算法的内容。我们学习了背包问题和最长上升子序列问题的解决方法,以及如何使用DP表格来求解这些问题。希望通过这些例子,你能够更好地理解DP算法的基本概念和应用。

其他信息

其他资源

Top