一个数组p[],长度plen,求其中最长单调递增子序列。
定义数组up[],up[i]表示长度为i的单调递增子序列中最后一位元素最小为up[i]。定义uplen表示最长的子序列长度
up[]必然是单调递增的
证明:
若对于0<i<i+1<=uplen,有up[i]>up[i+1],那么对于长度为i+1的子序列,只要去掉其中任意一个元素,就可以得到长度为i的子序列并且该子序列最后一位元素小于up[i],与up[i]定义矛盾。
若对于0<i<i+1<=uplen,有up[i]==up[i+1],那么只需把长度i+1的递增序列,去除最后一个,就可以得到末尾元素更小的长i的子序列,矛盾。
得证。
我们在从前往后的遍历p[]的过程中不断更新up[]数组。
for(int i=0;i<plen;i++)
{
若uplen==0//此时up[]中还没有数据,p[i]是第一个数据,所以最长子序列长度为1,末尾元素p[i]
{
up[1]=p[i];
uplen=1;
}
否则若存在up[index