算法第三章作业
1. 对动态规划算法的理解
动态规划与分治法一样,需要将大问题化小,不同的是分治法往往子问题相互独立,而动态规划子问题有重复,做用分治法的思维去做会出现大量重复计算,增加复杂度。而动态规划重在建表记录已解决的子问题的答案,其步骤为
(1)找出最优解性质,并刻画其结构特征
(2)递归的定义最优值
(3)以自底向上的方式计算最优值
(4)根据计算最优值时得到的信息,构造最优解
2. 编程题1、2的递归方程
3-1 单调递增最长子序列
longest[i]默认值全为1,sequence[i]为序列,则
j从1到i-1
longest[i] = max(longest[i] , longest[j] + 1)
for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (sequence[i] > sequence[j]) { longest[i] = (longest[i] > longest[j] + 1) ? longest[i] : longest[j] + 1; } } }
3-2 租用游艇问题
rent[i][j]表示直接从i到j的费用
初始值leastMoney[1] = 0, leastMoney[2] = rent[1][2]
则j从1到i-1
leastMoney[i] = max(leastMoney[j] + rent[j][i], leastMoney[i])
for (int i = 3; i <= n; i++) { leastMoney[i] = rent[1][i]; for (int j = 1; j < i; j++) {
leastMoney[i] = (leastMoney[j] + rent[j][i] < leastMoney[i]) ? leastMoney[j] + rent[j][i] : leastMoney[i]; }
}
3. 结对编程情况
开始做题的时候对动态规划还有点生疏,列不出递归方程,讨论了一会后才列出了实践题前两题,第三题在课后讨论了,又查了很久的资料后才写出来。这一章确实比较难,要建立好动态规划模型挺费脑,想到方法后就简单了。也感谢队友一起想方法,不然一节课下来前两题都写不完......