问题描述
求一个数组的最长递减子序列比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}。
问题分析
本问题类似编程之美中的求数组中最长递增子序列问题。可以利用动态规划方法解决。
假设在目标数组array[]的前i个元素中,最长递减子序列的长度为LDS[i]。那么
LDS[i+1] = max{1,LDS[k]+1},其中array[i+1]<array[k],for any k<=i。
即如果array[i+1]<array[k],那么第i+1个元素可以添加到LDS[k]长的子序列后构成一个更长的递减子序列。与此同时,
array[i+1]可以由自身构造成一个长度为1的子序列。
所以代码清单为:
for (int i = 0; i < len; i++) {
LDS[i] = 1;
for (int k = 0; k < i; k++) {
// LDS[i+1]=max{1,LDS[k]+1}, array[i+1]<array[k],for any k<=i;
if (array[i] < array[k] && LDS[k] + 1 > LDS[i]) {
LDS[i] = LDS[k] + 1;
}
}
}