动态规划之最长递增子序列(思路)

问题描述:
一个序列有N个数:A[1],A[2],…,A[N],求最长非降子序列的长度。
这是一个动态规划(Dynamic Programming)思想基本都会讲到的问题—LIS:longest increasing subsequence.
思路:
1)“子序列“和“子串”不同;
子序列在原序列中可以是不连续的,如[3,6,9]为[5,7,3,6,4,9]的子序列;
子串在原序列中必须是连续的,如”abchj”为”gtabchjlut”的子串;
2)此问题最普遍被接受的思路是:定义d[i]—序列[A1,A2,…,Ai]以Ai结尾的最长递增序列的长度。这里把一个上升子序列中最右边的那个数,称为该子序列的“结尾”。乍一看,这个思路和原问题说的是两码事,哪跟哪啊,我自己针对这个思路搜了许多资料,最终才醒悟过来。但是你要这样想:只要这N个子问题都解决了,最终符合要求的最长递增子序列必定属于这N个子问题中的某一个,问题是不就迎刃而解了。
3)网上有关各个语言实现该思路的代码很容易找,我就不贴了。
附:让我顿悟的那篇博客,感谢这位博主!

你可能感兴趣的:(算法)