算法第三章作业
一:对动态规划的理解
动态规划具备一下三个特点:
把原来的问题分解成了几个相似的子问题。(强调“相似子问题”)
所有的子问题都只需要解决一次。(强调“只解决一次”)
储存子问题的解。(强调“储存”)
一个很简单的例子就是斐波那契数列,在画出树形结构的时候发现很多分支都存在重复计算
动态规划通过巧妙的分治和记录子问题的解,可以给原本时间开销巨大的问题提供时间效率上大大优化的解决方案。
动态规划的本质对问题状态的定义和状态转移方程的定义,而储存重叠子问题的解只是一种“技巧”,与动态规划的本质无关(这是关键!!)
+
二: 编程题1: 思路 用i指针遍历数组 然后用j从0遍历到i 找出小于i的数字,并在dp数组+1 if(a[i] > a[j] && store[i] < store[j] + 1) store[i] = store[j] + 1; 最后在dp数组里找最大值。
编程题2: 思路 从最底层开始逐渐计算,其中站之间可能相邻,也可能不相邻,需要进行递归检测。 如果 A B C 之间若 AB + BC < AC 则AC之间的最少费用不是相邻得到的,可以知道B肯定是一个站点。 int temp = c[i][k] + c[k][j]; if(temp < c[i][j]) c[i][j] = temp; 最后返回c【1】【n】
结对编程情况:目前在leetcode上寻找多道动态规划题目,力求搞懂!