线性DP

动态规划:线性空间递推的实例解析

动态规划

动态规划,别名DP,他是一种与递归递推搜索比较像的一种算法,他是一种模型,一种思想,并没有固定的套路,它是一种针对特定的条件的一类问题,对各个状态进行分阶段,有顺序,无重复,决策性的遍历求解
之前的很多算法都是利用问题可划分,以及子问题之间的相似性来进行解决的,动态规划也是这个样子
阶段就是指动态规划吧问题进行划分若干个子问题逐层递归的时候,那个子问题的求解过程构成一个阶段,在完成前面的之前才能完成后面的
无后效性就是求解这个子问题不会受后续阶段的影响,这就叫无后效性


状态是指f方程 阶段划分的阶段 决策 指方程,这是dp的三个要素
动态规划就好像把一个固定的公式在相同的格式若干个输入数据运行,所以我们只要求出这个公式就很简单了,这个公式叫做状态转移方程,就叫状态设计
动态规划,是一种考察智力而不是套路的问题

线性DP

线性DP,表示具有线性阶段的DP算法,就好比最长的上升子序列、最长的公共子序列、数字三角形等入门的例题
最长上升子序列
给定一个长度为N的数列A,求数值单调递增的子序列的长度最长是多少,A的任意子序列B表示为B={a1 a2 a3 a4},1<2<3<4
状态 我们设f[i]表示以a[i]结尾的“最长上升子序列”的长度
阶段 子序列的结尾位置
方程 f[i]=max(f[i],f[j+1])
边界 f[0]=0
目标 max(f[i])

最长公共子序列
给定两个长度为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串的最长长度是多少
状态我们设f[i,j]表示前缀子串A[1 ~ i]和B[1 ~ j]的字符“最长公共子序列”的长度
阶段已经处理的前缀长度的长度
方程 f[i][j]=max(f[i-1][j],f[i][j-1],f[i-1][j-1]+1)
边界 f[i,0]=f[0,j]=0
目标 f[n,m]

数字三角形
给定一个共N行的三角性矩阵A,其中有i行i列,从左上角出发,每次向下或者向右走最后到达底部,求所有经过的点,和的最大是多少
状态 f[i][j]表示走过的和的最大值
阶段路径的结尾
方程 f[i][j]=a[i][j]+max(f[i-1][j],f[i-1][j-1])
边界 f[1][1]=a[1][1]
目标 max(f[n][j])

总结
线性DP体现在线性空间的递推,沿着各个维度进行线性增长,对状态空间进行转移发展,从而找到目标
复杂度为线性的,不能继续优化的动态规划,叫做线性DP
按着数据生成的顺序的动态规划
状态,也就是f数组,也就是答案所求的东西
阶段,就是指一个范围,寻找范围规划范围
方程,就是来更新f数组的算式
边界,为零的f数组
目标,最终的答案

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值