动态规划、迭代与递归

递归:好像相对高明,但其实效率而言递归并不是最佳方案。。

迭代:貌似复杂,其实性能更高效。

分而治之

DSA动态规划

所谓动态规划:就是通过递归,找出问题本质,并且给出一个初步的解之后,再将其等效的转换为迭代的形式。

  • make it work
  • make it right
  • make it fast

两个栗子:

1. 斐波那契数列(青蛙跳台阶):

  • 解决方法A:(记忆:memoization)  将已计算过实例的结果制表备查。
  • 解决方法B:(动态规划)  颠倒计算方向:由自顶而下递归,为自地而上迭代。

2. 最长公共子序列:

 对序列a[0,n]  b[0,m]  lcs(a,b)  无非三种情况:

  1. n=-1 or m=-1  , 则为空序列(“”)
  2. a[n] != b[m]   则  lcs(a[0,n], b[0,m))  与  lcs(a[0,n), b[0,m])中取长者(末字符不同,扣掉)
  3. a[n] = b[m] = 'x'   则 lcs(a[0,n), b[0,m))  + 'x'    #  末字符相同,都去掉,递归求解

 

总结:

递归:设计出可行且正确的解。

动态规划:消除重复计算,提高效率。

猜你喜欢

转载自blog.csdn.net/Scrat_Kong/article/details/82257912