通过最近对于一些算法题的思考,越来越发现动态规划方法的在时间上高效性,往往该问题可以轻松的找到暴力破解的方法,其时间复杂度却不尽人意。下面来看看几个常见的动态规划思路的经典问题
例一.有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?(腾讯电面题之一)
其状态转移方程为:
f(n):表示n阶楼梯有多少种走法
f(n)=f(n−1)+f(n−2)
f(1)=1,f(2)=2
例二:01背包问题
有n个重量和价值分别为vector weight, vector value的物品;背包最大负重为W,求能用背包装下的物品的最大价值?
输入:n =4
weight=2, 1, 3, 2
value =3, 2, 4, 2
W=5
输出=7
dp[i][j]表示前i号物品中能选出重量在j之内的最大价值
dp[i][j]=max(dp[i−1][j],dp[i−1][j−w[i]]+v[i]);
例三:最大连续子序列和
如给定数组[-2,1,-3,4,-1,2,1,-5,4]
连续的子数组为[4,-1,2,1]有最大和6
f(j+1)为以下标j结尾的连续子序列和的最大值
f(j+1)=max(f(j)+A[j],A[j])
target=maxf[j]
思考:最大连续子序列乘积
如给定数组[-2,1,-3,4,-1,2,1,-5,4]
连续的子数组为[4,-1,2,1]有最大和6
f(j+1)为以下标j结尾的连续子序列最大乘积值(1