1. 对动态规划算法的理解
动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是互相独立的,因此会存在子问题重复求解的情况,在递归求解的过程中,影响算法的时间复杂度,解决方式是使用“备忘录”将已经计算的子问题的结果记录下来。
动态规划算法有两个基本要素:
(1)最优子结构性质:问题的最优解包含了其子问题的最优解(在动态规划算法中,利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解)
(2)重叠子问题性质:在使用递归算法自顶向下解题时,每次产生的子问题并不总是新问题,有些子问题被反复计算(将已求解的子问题的结果保存在一个表格中,每次求解下一个子问题时,只需查找表格,已经计算就转向下一个子问题,未求解就求解后将结果保存)
动态规划算法适用于解最优化问题,通常可按以下4个步骤设计:
① 找出最优解的性质,并刻画其结构特征(分析题目)
② 递归地定义最优值(写出递归方程;最关键也最困难的步骤)
③ 以自底向上的方式计算最优值(使用填表的方法可避免递归,需注意填表范围、填表顺序以及边界条件)
④ 根据计算最优值时得到的信息,构造最优解(若只需求出最优值,此步骤可省略)
2. 分别列出编程题1、2的递归方程
数字三角形:m[i][j] = max{m[i+1][j], m[i+1][j+1]} + a[i][j]
最大子段和:m[i] = max{a[i], m[i-1]+a[i]}
单调递增最长子序列:m[i] = max{m[k] | a[k]<a[i]} (1<=k<i)
租用游艇问题:m[i] = min{m[k]+a[i][k]} (i<k<=j)
3. 结队编程情况
本次结对编程,采用分工合作的方式,每人先单独完成各自的题目,然后再互相检查,找到错误并加以修正,以及可以使代码更加优化的方法。采用这种方式编程,不仅可以培养彼此的默契,还可以让我们从彼此的编程中积累更多的好的idea。合作总能带来意想不到的结果,由于我们思考问题的方式有所不同,所以最后编写出来的代码总是有区别的,相比之下就各有千秋了。查看对方代码的同时,我们可以分享自己的想法,从而积累更多适用于不同的情景之中的解决方案。
posted on
浙公网安备 33010602011771号