动态规划

来源:互联网 发布:mac触摸板按键声音大 编辑:程序博客网 时间:2024/06/13 04:05

台阶问题
有n级台阶,一个人每次上一级或者两级,问有多少种走完n级台阶的方法?
f(i)=f(i-1)+f(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)位置的最小路径和。
dp
1 4 9 18
4
14
22
dp[i][j]=m[i][j]+{dp[i-1][j]或者dp[i][j-1]中的最小值}

最长递增子序列的问题
给定数组arr,返回arr的最长递增子序列长度。比如arr={2,1,5,3,6,4,8,9,7},最长递增子序列为{1,3,4,8,9},返回arr的最长递增子序列长度。比如arr={2,1,5,3,6,4,8,9,7},最长递增子序列为{1,3,4,8,9}所以返回这个子序列的长度为5。
解决方案:
arr:2 1 5 3 6 4 8 9 7
dp:1 1 2 2 3 3 4 5 4
dp[i]表示在必须以arr[i]这个书结尾的情况下,
arr[0..i]中最大递增子序列长度。
dp[i]=max{dp[j]+1(0<=j

0 0