标签: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