算法第三章作业--动态规划
1. 作业题“挖地雷”分析
1.1 设有n个地窖,
w[ ]记录每个地窖地雷数
a[i][j]记录i,j地窖之间是否有通路
f[i]记录从第i个地窖开始挖可以最多挖的地雷数量
f[n]=w[n];
递归方程式:
for(int i=n;i>0;i--)
f[ i ]=max(w[i]+f[j]) (i<j<=n,a[i][j]!=0)
1.2 f[ ]为一维表,填表范围为f[1]~f[n],填表顺序为从后面填起
1.3 时间复杂度为0(n^2),空间复杂度为0(n^2)
2. 你对动态规划算法的理解
动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,再结合这些子问题的解得到原问题,与分治法类似。但是,不同的是,用动态规划求解的问题经分解得到的子问题往往不是互相独立的,为了避免重复计算同样的子问题,可以选择保存已解决的子问题的答案,比如通过填表方式。
动态规划算法适用于最优化问题,通常有四个步骤:
(1)找出最优解的性质,并刻画其结构特征
(2)列出递归方程
(3)找出其子问题联系并填表
(4)得出解
动态规划算法有两个基本要素:
(1) 最优子结构;问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。
(2) 重叠子问题;在解题中,每次产生的子问题并不总是新问题,有些子问题被反复计算。动态规划算法利用这种子问题重叠性质,对每个子问题只解一次,然后保存在一个表格中,在再次遇到同样子问题时,只需查询表格,可减少运算时间,以提高解题效率。
3. 说明结对编程情况
我的结对伙伴是何雨婷,这次我们交换任务,我负责在旁指导,她负责打代码,这次明显与上次结对体验与收获不一样。首先,我们一起讨论了解题思路,与大致方法,再进行打代码。在何打代码的过程中,为了让我更好理解代码作用,她会偶尔加以解释。她思路不清晰时我也会在旁边指引一下,我疑惑时也会向她提问。因为每个人打代码的习惯和命名方式不一样,我也在她打代码过程中学到了很多。结对编程是个能提高编程能力的很好办法。
浙公网安备 33010602011771号