动态规划--算法

1、动态规划:将求解问题分解成若干个子问题,求解子问题,这些子问题不是独立的

  求解后的子问题都会记录到表中,每个子问题仅求解一次,  下次遇到这些子问题直接取解

自底向上的方式计算最优解

2、最优子结构:如果一个问题的最优解中包含了子问题的最优解,说明该问题具有最优子解决

3、重叠子问题:

动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,

4、0-1背包问题

构造最优解的时间复杂度  O(n)

算法的时间复杂度 O(n*w)

5、典型案例--最长公共子序列LCS:

6、最优子结构

7、0-1背包问题 

考虑一个背包问题,共有n=5个物品,背包容量为W=10,物品的重量和价值分别为:w={2,2,6,5,4},v={6, 3,5,4,6},求背包问题的最大装包价值。若此为0-1背包问题,分析该问题具有最优子结构,定义递归式为

其中c(i,j)表示i个物品、容量为j的0-1背包问题的最大装包价值,最终要求解c(n,W)。
采用自底向上的动态规划方法求解,得到最大装包价值为( ),算法的时间复杂度为( )。
若此为部分背包问题,首先采用归并排序算法,根据物品的单位重量价值从大到小排序,然后依次将物品放入背包直至所有物品放入背包中或者背包再无容量,则得到的最大装包价值为( ),算法的时间复杂度为( )。

问题1选项
A.11
B.14
C.15
D.16.67

问题2选项
A.Θ(nW)
B.Θ(nlgn)
C.Θ(n2)
D.Θ(nlgnW)

问题3选项
A.11
B.14
C.15
D.16.67

问题4选项
A.Θ(nW)
B.Θ(nlgn)
C.Θ(n2)
D.Θ(nlgnW)

问题1选项--解析

0-1背包问题指的是每种 物品只能选一个

动态规划:自底向上的方式,是价格从高到低依次顺序选择

由于总容量是10,

可以看到装第一个和第五个物品价值是最高的,这时候V=12了,此时已占了6的重量了,还剩4的重量,只能装一个价值为3的2,重量加起来是8,最大价值是13

问题2选项 -- 解析

算法过程是对物品n和背包容量W分别进行比较以找到最优结果,因此时间复杂度为Θ(nW)。

问题3选项 -- 解析

计算出单位重量v={3 1.5   5/6   0.8   1.5}, 可以看到1  2  5的单位价值最高,

选择1、2、5后背包重量(2+2+4)=8 ,还有2个重量可以选择3得  2*(5/6)= 5/3 的价值,就是1.67,所以第三空3 *2 + 1.5*2 +  1.5*4  + 2*(5/6)  =  16.67。

问题4选项--解析

时间复杂度,本题先进行归并排序,然后再根据有序序列来选择放入背包的物品,因此算法分两部分,首先是归并排序时间复杂度为Θ(nlgn),然后是放背包,因为已经排过序,所以只需要线性处理即可,此时时间复杂度为Θ(n),综合起来,由于Θ(nlgn)>Θ(n),因此整体时间复杂度为Θ(nlgn)。

 8、最长公共子序列LCS:中间不必连续

最优子结构

 子序列: 给定字符串str = "ABCDADNENXY",从str中任意去掉若干个(含0个)字符,剩下的就是这个str的子序列,如ABC, ABXY, DADXY等,中间不必连续.

子串:和子序列不同,子串必须是连续的,如ABCD,ENXY,CDADNE都是子串,而AXY不是,因为中间断开了,把连续.

子串必定是子序列,子序列不一定是子串.

 给出字符串str1和str2,如果一个字符串s同是str1和str2的子序列,则称s为二者的公共子序列,如果s最长,则称s为最长公共子序列,即LCS.

9、求解两个长度为n的序列X和Y的一个最长公共子序列(如序列ABCBDAB和BDCABA的一个最长公共子序列为BCBA)可以采用多种计算方法。如可以采用蛮力法,对X的每一个子序列,判断其是否也是Y的子序列,最后求出最长的即可,该方法的时间复杂度为(  )。经分析发现该问题具有最优子结构,可以定义序列长度分别为i和j的两个序列X和Y的最长公共子序列的长度为C[i,j],如下式所示。

采用自底向上的方法实现该算法,则时间复杂度为(  )。

问题1选项
A.O(n²)
B.O(n²lgn)
C.O(n³)
D.O(n2n)

问题2选项
A.O(n²)
B.O(n²lgn)
C.O(n³)
D.O(n2n)

第1题:1.X、Y的所有子序列都检查过后即可求出X、Y的最长公共子序列。X的一个子序列相应于下标序列1,2,…,n的一个子序列。因此,X共有2n个子序列。当然,Y也有2m个子序列。判断一个子序列是否也是Y的子序列的时间是n,因此时间复杂度为O(n2n)

问题2. 动态规划的一个计算最长公共子序列的方法如下,两个序列 X、Y :
设有二维数组 c[i][j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有题干给定的函数表现形式:
其中,c(i,j)当 X 的第i位与 Y 的第 j 位完全相同时为“1” ,否则为“0” 。
此时,c[i][j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。该算法的空间、时间复杂度均为O(n2)。

10、在求解某问题时,经过分析发现该问题具有最优子结构性质,求解过程中子问题被重复求解,则采用(  )算法设计策略;若定义问题的解空间,以深度优先的方式搜索解空间,则采用(  )算法设计策略。

问题1选项  B
A.分治
B.动态规划
C.贪心
D.回溯

问题2选项   C
A.动态规划
B.贪心
C.回溯
D.分支限界

分治法的设计思想是将一个难以直接解决的大问题分解成一些规模较少的相同问题以便各个击破,分而治之。
动态规划法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是独立的。若用分治法来解这类问题,则相同的子问题会被求解多次,以至于最后解决原问题需要耗费指数级时间。动态规划法可求解的问题一般具有最优子结构和重叠子问题,因此本题第一空选择B选项动态规划法。
贪心法经常用于解决最优化问题,但他的最优往往是从局部最优来考虑的,每一步都选最优的方案,但这种方案不一定能得到整体上的最优解。
回溯法是一种既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根节点出发搜索解空间树

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值