算法第三章作业

1、对动态规划算法的理解:

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,这些子问题往往有重叠子问题,从这些子问题的解得到原问题的解。可以用一个表来记录所有已经解决的子问题的答案,不管这个子问题以后是否被用到,只要它被计算过,就把结果填入表中。动态规划算法往往适用于解最优化问题,首先找出最优解的性质,找出递归方程,然后自底向上找出最优值以构造最优解。动态规划算法将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。

2、

编程题1的递归方程:

dp[i] = max(dp[j]+1, dp[i]);

编程题2的递归方程:

i==n, dp[i] = 0;
i<n, dp[i] = min{ r[i][k] + dp[k] }, i<k<=n;

3、结对编程情况:

我们在做编程题1时结合了学习最长公共子序列问题时的一些思路,很快的找到了思路,在求以ai为末元素的最长递增子序列时,找到所有序号在L前面且小于ai的元素aj,即j<i且aj<ai。如果这样的元素存在,那么对所有aj,都有一个以aj为末元素的最长递增子序列的长度f(j),把其中最大的f(j)选出来,那么f(i)就等于最大的f(j)加上1,即以ai为末元素的最长递增子序列,等于以使f(j)最大的那个aj为末元素的递增子序列最末再加上ai;如果这样的元素不存在,那么ai自身构成一个长度为1的以ai为末元素的递增子序列。在做编程题2时我们经过讨论找到了递归方程,但是在打代码时,由于对全局变量和引用没有好好理解,导致代码出现了一些问题,最后我们互相讨论,一起查阅资料,终于克服了难题把题ac了。在结对过程中,我们一起讨论,互相学习,提高了学习效率,很开心!

 

posted @ 2018-10-26 17:46  嘉兰  阅读(193)  评论(0编辑  收藏  举报