算法第三章作业
一、动态规划算法的理解
1.与分治法比较
1)相同点:基本思想,将求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
2)不同点:适用于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。
2.实现:用一个表来记录所有已近解决的子问题的答案,不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中,在需要时再找出已求得的答案。
3.好处:避免了大量重复的计算,得到多项式时间算法。
4.通常按以下四个步骤设计:
1)找出最优解的性质,并刻画其结构特征
2)递归地定义最优解
3)以自底向上的方式计算出最优值
4)根据计算最优值时得到的信息,构造最优解
5.基本要素:
1)最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质
2)重叠子问题:在用·递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。
3)备忘录方法:用表格保存已解决的子问题答案,在下次需要解此子问题时,只要简单地查看该子问题的解答,而不必重新计算,其递归方式是自顶向下的。
6.经典运用动态规划算法的问题:
1)矩阵连乘问题
2)最长公共子序列
3)最长子段和
4)0-1背包问题
二、编程题递归方程
1.单调递增最长子序列:m[i] = max{ m[k] + 1 | a[k] < a[i] } (1<= k < i)
m[i] = 1 (k = 0)
a[i] : 输入数列
2.租用游艇问题:m[i]=min{cost[i][k] + m[k] }(i<k<=n)
cost[i][j] :从 i 到 j 要cost的money
三、结对编程情况
我们是一起讨论思路,然后代码都是由伙伴打的,被倩宝的打代码速度震惊,完全不用看键盘,打字飞快。第二题,因为伙伴做过类似的题,一下子就做出来了。前两题都没有写递归方程式。第三题,比较难,没写出递归方程式的话,比较难实现出来,课上没由有完全做出来,最后课后伙伴做出来了,跟我分享思路。
浙公网安备 33010602011771号