python 最长递增子串:动态规划

本文通过动态规划解决最长递增子序列(LIS)问题,以数组str=[5, 3, 4, 8, 6, 7, 9]为例,解释如何利用状态转移公式if(str[m]>str[preIndex]): LIS[m]=max{ LIS[preIndex]+1 }找到最长递增子串,并提供Python代码实现。" 133258362,19453730,Python 3与xlrd库解析Excel文件教程,"['Python', 'Excel处理', '数据解析']

问题描述:

给定一个数组str=[5, 3, 4, 8, 6, 7,9],求出其最长递增子串:LongestIncreaseSub=[3,4,6,7,9]

解决思路:

解决最长子序列(Longest Increase Subset, LIS)问题,使用动态规划(Dynamic Programming,DP),之前说到动态规划的规划(Programming)是表格的意思,是对递归的一种优化,递归是不管需不需要都进行重新计算,其计算复杂度极高,动态规划用表格(数组)来存储其之前的状态,当进行下一步计算的时候直接调用不需要重新计算。那么问题来了,动态规划需要确定两个点:状态、状态转移方式[1]。在这里从另一个角度说一下动态规划:

已知问题规模为n的已知条件Y,求解一个未知解X。(我们用Yn表示“问题规模为n的已知条件”)

此时,如果把问题规模降到0,即已知Y0,可以得到Y0->X.

如果从Y0添加一个元素,得到Y1的变化过程。即Y0->Y1; 进而有Y1->Y2; Y2->Y3; …… ; Yi->Yi+1. 这就是严格的归纳推理,也就是数学归纳法

对于Yi+1,只需要它的上一个状态Yi即可完成整个推理过程(而不需要更前序的状态)。我们将这一模型称为马尔科夫链(自然语言处理中经常使用)。对应的推理过程叫做“贪心法”。

然而,Yi与Yi+1往往不是互为充要条件,随着i的增加,有价值的前提信息越来越少,我们无法仅仅通过上一个状态得到下一个状态,因此可以采用如下方案:{Y1->Y2}; {Y1, Y2->Y3}; {Y1,Y2,Y3->Y4};……; {Y1,Y2,...,Yi}->Yi+1. 对于Yi+1需要前面的所有前序状态才能完成推理过程, 高阶马尔科夫链。也就是DP的另一个解释。

 

借用文献[2]中一个形象的图就是:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值