学习笔记 关于动态规划

动态规划  英文 dynamic programming 

基本思想:把一个大问题分解成很多小问题,然后再将小问题逐个求解,利用小问题的解求出大问题的解。 可以优化程序速度的原因是,往往这些小问题都很类似所以只算一遍,将已经算出来的小问题答案存起来遇到重复的题目的时候直接调取记忆(查表)即可得出,避免了重复计算。 

适用于:后面不会改变其结果的重复性问题

经典例子:

Fibonacci polynomial就是前两个数相加是第三个数的那个,有些时候是三角形,都一样


Knapsack problemNP-complete):给定一组物品每种物品都有自己的重量和价格,包包只能装固定的重量,如何选择,能让包包里面装的东西价值最大。

如果每种重量物品的数量无限用, 总重量不超过Y的前提下:(pj为物品的价格wj为j物品的重量
A (0) = 0
A ( Y ) = max {  A ( Y - 1 ), max {  pj  +  A ( Y  -  wj ) |  wj  ≤  Y  } }

如果每种重量的物品只能有1个或0 个,总重量不超过 Y 的前提下,前 j 种物品的总价格所能达到的最高值定义为 A ( j Y )。 A ( j Y )的递推关系为:

A(0, Y) = 0
A(j, 0) = 0
如果wj > YA(jY) = A(j - 1, Y)
如果wj ≤ YA(jY) = max { A(j - 1, Y), pj + A(j - 1, Y - wj) }

学习笔记 关于动态规划_第1张图片(pic from wiki)


LCS(longest common sequence )老师上课用生物课中的ATGC 引入。找两端基因 最长的相同的 subsequence 这里注意区分 subsequence (elements here are separate 但是是按顺序的) 和substring(要每个element连在一起)的区别

先图标理解怎么分析:

1,遇到一样的就把数字+1,箭头指向左上角, 

2,遇到不一样的,且上面和左边的大小一样 就统一一个方向吧上面或者左边其中一个方向的数字写下来, 

3,如果遇到不一样,且上面和左边的大小不一样就选两个中大一点的那个然后把大一点的那个数字写下来,(出来的结果如下图)

 然后找最大的数字按照箭头指的方向走回去,遇到左上斜的才把它写下来, 如果有两个数字一样就说明有多条这么长的LCS



你可能感兴趣的:(学习笔记 关于动态规划)