标签:for 一个 details body pre 阶段 过程 art 状态
实验报告 |
---|
课程名称 |
学生姓名 |
实验名称 |
实验地点 |
1. |
LCS问题: |
给定两个字符串,求两个字符串的最长公共子序列 |
背包问题: |
此处应指01背包问题 |
给定n个物品,每个物品具有价值和重量两个属性。 |
求在限定的重量V的背包中装入尽可能多的物品以达到最大的价值 |
2. |
这两个问题都是动态规划中的经典问题 |
LCS: |
01背包: |
LCS举例: |
i = 1,j = 1 |
a[i] = a,b[j] = b |
dp[1][1] 更新为 0 |
i = 1,j = 2 |
a[i] = a,b[j] = b |
dp[1][2] 更新为 0 |
i = 1,j = 3 |
a[i] = a,b[j] = c |
dp[1][3] 更新为 0 |
i = 1,j = 4 |
a[i] = a,b[j] = a |
此时发现a[i] == b[j] |
dp[1][4] 更新为 1 |
i = 2,j = 1 |
a[i] = b,b[j] = b |
此时发现a[i] == b[j] |
dp[2][1] 更新为 1 |
i = 2,j = 2 |
a[i] = b,b[j] = b |
此时发现a[i] == b[j] |
dp[2][2] 更新为 1 |
i = 2,j = 3 |
a[i] = b,b[j] = c |
dp[2][3] 更新为 1 |
i = 2,j = 4 |
a[i] = b,b[j] = a |
dp[2][4] 更新为 1 |
i = 3,j = 1 |
a[i] = c,b[j] = b |
dp[3][1] 更新为 1 |
i = 3,j = 2 |
a[i] = c,b[j] = b |
dp[3][2] 更新为 1 |
i = 3,j = 3 |
a[i] = c,b[j] = c |
此时发现a[i] == b[j] |
dp[3][3] 更新为 2 |
i = 3,j = 4 |
a[i] = c,b[j] = a |
dp[3][4] 更新为 2 |
i = 4,j = 1 |
a[i] = d,b[j] = b |
dp[4][1] 更新为 1 |
i = 4,j = 2 |
a[i] = d,b[j] = b |
dp[4][2] 更新为 1 |
i = 4,j = 3 |
a[i] = d,b[j] = c |
dp[4][3] 更新为 2 |
i = 4,j = 4 |
a[i] = d,b[j] = a |
dp[4][4] 更新为 2 |
背包问题举例: |
输入: |
3 70 |
71 100 |
69 1 |
1 2 |
考虑加入第一个物品,由于容量只有70,71已经超出了70,此时第二重的循环并不会执行 |
考虑加入第二个物品,从69开始执行,此时表示前两物品,不超过69的最大价值,此时显然加入要比当前不加入要好(不加入为0),于是DP[2][69]更新为1。继续循环,此时表示前两个物品,不超过70的最大价值,显然也比不加入好(不加入为0) 于是DP[2][70] = 1 |
考虑加入第三个物品,其重量为1,从1开始循环,和上一次类似地,到70之前都会考虑加入物品,当最后一次发现恰好可以从DP[2][69]得到转换一,与是得到DP[3][70] = DP[2][69] + 1 = 3 |
一点优化:01背包的第一维只和上一个阶段的状态有关,于是可以用滚动数组使空间复杂度优化到O(M) |
3. |
LCS: |
/* 假设X长度m<=Y长度n */ |
LCS-LENGTH(X, Y) |
m <- X.length |
n <- Y.length |
let c[m] be new table |
/* pre记录被前一个覆盖的值 */ |
pre <- 0 |
for i<-1 to n do |
return c[m] |
———————————————— |
版权声明:本文为CSDN博主「THOOOR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 |
原文链接:https://blog.csdn.net/THOOOR/article/details/105555841 |
01背包: |
4. |
LCS:容易发现LCS算法会严格地跑满两重循环 |
于是时间复杂度O(NM) 空间复杂度相同 |
01背包:一共要枚举N个物品,每次枚举到背包的容量 |
因此复杂度O(NM) 实际过程中会有许多无用状态 |
空间复杂度可以用滚动数组优化为O(M) |
5. |
Algorithm-Class-codes/project9 : LCS at main · MQFLLY/Algorithm-Class-codes (github.com) |
Algorithm-Class-codes/project9; 01Packing at main · MQFLLY/Algorithm-Class-codes (github.com) |
标签:for 一个 details body pre 阶段 过程 art 状态
原文地址:https://www.cnblogs.com/hznumqf/p/14896925.html