算法第三章作业

一、对动态规划的理解

基本思想:

  将所要求解的问题划分为许多个子问题,但子问题之间是有联系的,然后求出子问题的最优解就是原问题的最优解了,举个例子,就像你要去一个地方,每走一段路都会遇到分岔口,不同走法路程不同,你想要走最少路程,需要逐步推出每一步的最优解都是上一个子问题的最优解,逐步得出原问题的最优解。

  这里和分治法不一样,第一个区别是,分治法分解的子问题是和原问题具有相同求法,逐步分解到最小,而动态规划不是,它的子问题并非独立,而是有联系的,再者,分治法会出现子问题重复多次计算的情况,而动态规划可以保存每次子问题求出的最优解,需要用的时候就可以拿来用,可以节省很多空间和时间。

 

具体步骤:

1、划分子问题,确定子问题边界,将问题求解转变成多步判断的过程;

2、定义优化函数,以该函数极大(或极小)值作为依据,确定是否满足优化原则;

3、列优化函数的递推方程和边界条件;

4、自底向上计算,设计备忘录(表格);

5、考虑是否需要设立标记函数;

6、用递推方程或备忘录估计时间复杂度。

 

 

二、编程题1、2的递归方程

1、单调递增最长子序列

题目:设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

递归方程:m[i] = max { m[k] + 1 | a[k] < a[i] } ( 1 <= k < i )

2、租用游艇问题

题目:长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。

递归方程:m[i] = min { cost[i][k] + m[k] } ( i < k <= n ) 其中,m[i] :为第i个站点到终点的最小费用。

 

 

三、结对编程的情况

  这次结对编程依旧是采取一起做题的形式,大家一起思考题目,齐力解决,当一个人想不出来时候还会有另一个人想,主要是递归方程的推导。合作可以大家一起想出递归方程,然后到代码的实现部分,就分工完成,我实现代码的能力得到了一些提升,这方面我的伙伴比我强,跟他学习了很多。彼此互补,结对编程很快乐,再也不是自己一个人埋头敲代码,而是能有个人交流思想,交流经验彼此学习。

posted @ 2019-11-02 11:00  ErwinGluttony  阅读(212)  评论(0编辑  收藏  举报