算法第三章作业
1、对动态规划算法的理解:
动态规划和上一章学的分治策略都是将一个问题分解成多个子问题进行求解,不同的是,动态规划的子问题不是互相独立的,一个子问题的求解要依靠另一个子问题的答案。因此就有了填表的方法,填表时要注意填的顺序,根据已填的内容动态地决定未填的内容。这样的算法避免了重复大量的计算从而降低了时间复杂度。
对于此类问题,要思考:
如何把问题分解成子问题、子问题有哪些已重复计算的部分、如何列出递推公式、填表顺序是什么、边界值或初始值如何得出。
2、编程题1(单调递增最长子序列)递归方程:若num[i] > num[j] , dp[i] = max(dp[i], dp[j] + 1);
否则,dp[i] = 1;
编程题2(租用游艇问题)递归方程:r[i][j] = min((r[i][k]+r[k][j]), r[i][j]) ;
3、结对编程情况:
本周继续结对编程,由于两个人在读题目之后都会自己的理解,相互交流后也能更快地找到解题思路,编程过程中能互相指正一些bug,提高了效率。