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