private void findLDS() {
Integer[] array = Arrays.copyOf(elephants.iq, elephants.iq.length);
Hashtable<Integer, Integer> eq = elephants.elephantiqs;
Integer[] lds = new Integer[array.length];
Integer[] prev= new Integer[array.length];
lds[0] = 0;
prev[0] = 0;
int maxlds = 1, ending=0;
for(int i = 0; i < array.length; ++i) {
lds[i] = 1;
prev[i] = -1;
for (int j = i; j >= 0; --j) {
if(lds[j] + 1 > lds[i] && array[j] > array[i] && eq.get(array[j]) < eq.get(array[i])) {
lds[i] = lds[j]+1;
prev[i] = j;
}
}
if(lds[i] > maxlds) {
ending = i;
maxlds = lds[i];
}
}
System.out.println(maxlds);
for(int i = ending; i >= 0; --i) {
if(prev[i] != -1) {
System.out.println(eq.get(array[prev[i]]));
}
}
我已将此算法基于此SO question。此代码试图找到最长的递减子序列而不是增加。 array []按降序排序,我也有一个哈希表,大象IQ作为权重的关键。
我很难理解DP,我需要一些帮助。
除了跟踪prev []中选择的序列之外,我的算法似乎工作得很好,因为它总是错过一个元素。有谁知道怎么做?
答案 0 :(得分:2)
接近这个的几种方法:
如果您不了解DP增长最长的子序列O(N ^ 2),那基本上就是这样:
llis
代表“最长增加子序列”,长度 N ,现在有大象的数量。创建另一个名为last
的数组,其长度相同。我将假设已排序的大象列表在问题陈述中称为array
。llis
中索引 n 的元素(这是一个不同的“n”)&lt; N 将是array
的子数组从索引0到 n 的最长增长子序列的长度,包括端点。另请说,索引 n 的next
数组中的元素将是array
中增长最长的子序列中的下一个索引。llis
中的强> N - 1 元素,找到实际的子序列将简化为遵循next
数组中的索引。llis[k] + 1
。 (另外,请记住将next[k]
设置为 n ,因为增加子序列中的下一个大象将是 n 中的大象。)llis[n] = max(llis[n], llis[k] + 1)
的DP关系。只需按正确的顺序处理 n (线性),您就应该得到正确的结果。llis
中找到最大号以获得最终结果。