代码改变世界

第三章作业

2018-10-30 08:40  linzexuan  阅读(123)  评论(0编辑  收藏  举报

 第三章  动态规划

1)对动态规划的理解

动态规划的基本思想:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

但动态规划中存在重叠子问题的性质,会造成时间复杂度的增加,使算法的性能变差。

在用动态规划算法时,会用一个表来记录所有已经解决的子问题的答案,只要计算过就会被填入表中。这样避免了大量的重复计算,同时也是解决重叠子问题有效方法。在填充表格的时候,要考虑填充表格的规律,常见自底向上填充,如编程题2。

动态规划也是一个寻找最优子结构的算法,能够由局部的最优解推出全绝的最优解。

 

 

2)编程题 1,2 的递归方程

单调递增最长子序列

a[n]存储 n 个数字;

b[n]存储第i(i = 0, 1, ... , n)的单调最长子序列;

b[j] =max(a[i]+1, a[j])

 

所需最少租金;

m[i][j]表示从第i到第j个港口所需的租金;i, j, k 分别表示港口;

i = j,  m[i][j] = 0;

i < j,  m[i][j] =min{ m[i][k] + m[k][j], m[i][j] } ( i < k < j)

 

 

3)说明结对编程的情况

在第 3 章的结对编程中,在求单调最长子序列时,一开始的想法是用一个一维数组b[i] 存储整个序列中比第 i 个数大的个数,在队友的提醒下,这种想法不能实现 b[i] 中存储的是单调子序列的长度,而仅是解决了比较大小的问题。在求游艇租金的问题中,起初一直设了两个数组,一个存储输入的租金,另一个数组存储从 i 到 j 的最小租金,结果一直是答案错误,后在交流思考之后,将输入和通过循环计算的租都存储在同一个数组中,最后通过了编译,答案正确。结对编程让我看到了自己对问题理解的偏差,通过结对编程,看到了自己编程上的不足,一定程度上提高了自己的解决问题的能力和编程能力。