算法:动态规划:求最长字段

01. 算法:动态规划:求最长字段

令n个数为x[]={x1,x2,x3…xn},设m[j]是以x[j]开头的一个最长单调递增序列,其长度为c[j]

设原问题的所求最优解是:max{c[j]},显然,c[j]有下面递归式成立:
c[j]=max{max{c[k]}+1,1}
j=k<=n&&x[j]<=x[k]
注:动态规划就是要把大事化小,小事化了,我们j从n开始,
c[n]=1 j=n
当j<n时
if(x[j]<x[k])
c[j]=max{c[k]}+1
else if(x[j]>x[k])
c[j]=1
重点:k也要循环,这是我作为初学者最为不懂得。
举个例子:
数列为{4,2,1,3,9,11,6,8}
8的最长长度为:1
6的最长长度为:2
11的最长长度为:1
9的最长长度:2
3的最长长度:3
1的最长长度:4
2的最长长度:4
4 的最长长度:3
显然时间复杂度为n^2

改进:
a[] 长度为i的候选序列的结尾元素的位置
b[] 每个元素结尾的单调递增序列的前一个元素位置

数组为m[]={4,2,1,3,9,11,6,8,4,15}
此为a[]数组的变化方式
在这里插入图片描述
颜色表示:每当遍历一个数k时,在a[]中找到i最小且a[i]大于k.则用k在m中的编号替代a[i].q且用b[]记录a[i-1]的数(也就是记录在a数组中前一个数的值(值为在m中的序号))
此为b[]数组的变化方式
在这里插入图片描述
找最长递增子段,即从a最后确定的一组最后一个数开始找
即最长为 10-8-7-4-3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值