问题14:求最长下降序列•给出N个数,若ij,且AiAj,则Ai和Aj构成了下降序列。•对输入的N个数,求最长下降序列长度。例如:389,207,155,300,299,170,158,65这里最长下降序列长度为:6序列为:389,300,299,170,158,65分析•设f(i)表示前i个数的最长不上升序列的长度。则,f(i)=max{f(j)+1},其中jianda[j]a[i]这里0ji=n。显然时间复杂度为O(n2)。•上述式子的含义:找到i之前的某j,这个数不比第i个数小,对于所有的j取f(j)的最大值。优化•分析样例•这里找j,是在1~i之间进行寻找,那么我们能否快速查找到我们所要更改的j呢?•要能更改需要两个条件:–jianda[j]a[i]–f(j)尽可能大•以上两个条件提示我们后面的值一定要小于等于前面的值。因此我们试着构建一个下降的序列。在这个下降的序列中查找可以更改的f值,使得序列的值尽可能大。i1234567838920715530029917015865f12323456•具体过程:i1234567838920715530029917015865第1次389第2次389207第3次389207155第4次389300155(由于207300389,因此更新)第5次389300299(由于155299300,因此更新)第6次389300299170第7次389300299170158第8次38930029917015865思考?•有些同学可能会问:–对于每个f,为什么只保留一个数值呢?–而对于该序列,为什么要保留较大的值呢?1.再回过头来看方程:f(i)=max{f(j)+1},其中jianda[j]a[i]该式子表示找前面的一个最大f的符合条件的j,因此只要保存符合条件的最大的j就可以了。2.在f值相同的情况下,保留较大的数显然更好。因为后面的数若能跟较小的数构成下降序列也一定能能较大的数构成下降序列,反之则不一定。例如207与300的f=2,但207不能与299构成下降序列,而300则可以。3.因为生成的序列为有序序列,因此我们可以采用二分查找的方法很快查找到更新的值,时间复杂度为O(n㏒n)