动态规划经典题讲解

来源:互联网 发布:沃尔玛数据流程图 编辑:程序博客网 时间:2024/05/29 11:24

案例一:有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法?

方法一:暴力搜索方法的技巧:写出表达式和初始项!!

这里面从想上到第i层台阶的方式有两种:

1. 从第i-1层台阶迈一步到第i层台阶

2. 从第i-2层台阶迈两步到第i层台阶

所以有:

f(1)=1     i=1

f(2)=2     i=2

f(i)=f(i-1)+f(i-2)    i>2

根据上面的表达式可以很容易写出暴力搜索的递归代码!!!

方法二:记忆搜索方法

方法三:动态规划


案例二:给定给一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置。路径上所有的数字累加起来就是路径和,返回所有的路径中最小路径和。

如果给定的m如大家看到的样子,路径1.3.1.0.6.1.0是所有路径中路径和最小的,所以返回12.

1  3  5  9

8  1  3  4

5  0  6  1

8  8  4  0

假设矩阵m的大小为m*n,行数为m,列数为n。生成大小和m一样的矩阵dp,行数为m,列数为n。dp[i][j]的值表示从左上角,也就是(0,0)位置走到(i,j)位置的最小路径和。

解析:因为每次只能向下走或者向右走,并且从i到j的路径和是要包括节点j上的值的,所以第一行每个节点的最小路径和就是累加的和。第一列的最小路径和也是累加的和。其余节点的最小路径和就按照下面的公式就可以:


按照从左到右从上到下的顺序计算就可以。


案例三:给定数组arr,返回arr的最长递增子序列长度,比如arr={2,1,5,3,6,,4,8,9,7},最长递增子序列为{1,3,4,8,9},所以返回这个子序列的长度5.

解析:生成一个数组dp,长度和arr相等。其中,dp[i]表示必须以arr[i]这个数结尾的情况下,arr[0,...,i]中的最大递增子序列长度。

公式为:dp[i]=max{dp[j]+1(0<=j<i,arr[j]<arr[i])}


案例四:给定两个字符串str1和str2,返回两个字符串的最长公共子序列。例如:str1="1A2C3D4B56",str2=“B1D23CA45B6A”,‘123456’或者“12C4B6”都是最长公共子序列,返回哪一个都可以。



案例五:一个背包有一定的承重W,有N件物品,每件都有自己的价值,记录在数组v中,也都有自己的重量。记录在数组w中,每件物品只能选择要装入背包还是不装入背包,要求在不超过背包承重的前提下,选出物品的总价值最大。



案例六:给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价。返回将str1编辑成str2的最小代价。比如:

str1="abc"      str2="adc"    ic=5   dc=3  rc=2从“abc”编辑成“adc”.把‘b’替换成‘d’是代价最小的,所以返回2。在比如,str1=“abc”,str2=“adc” ic=5,dc=3,rc=100。

从“abc”编辑成“adc”,先删除'b',然后插入'd'是代价最小的,所以返回8.



按照上面的方式,从左到右,从上到下计算dp的值,最终返回dp最右下角的值就可以。

按照上面的方式,从左到右,从上到下计算dp的值,最终返回dp最右下角的值就可以。


关于动态规划,可以查看http://dec3.jlu.edu.cn/webcourse/t000048/yun/ch5_02.htm这篇文章。


关于背包问题的详细解释可以查看http://www.cnblogs.com/Christal-R/p/Dynamic_programming.html这篇博客。里面对于最优性原理进行了详细的解释



原创粉丝点击