39 lines
800 B
Java
39 lines
800 B
Java
|
import java.util.*;
|
||
|
|
||
|
// https://en.wikipedia.org/wiki/Longest_increasing_subsequence
|
||
|
public class Lis {
|
||
|
|
||
|
public static int[] getLis(int[] x) {
|
||
|
int n = x.length;
|
||
|
int[] len = new int[n];
|
||
|
Arrays.fill(len, 1);
|
||
|
int[] pred = new int[n];
|
||
|
Arrays.fill(pred, -1);
|
||
|
int bi = 0;
|
||
|
for (int i = 1; i < n; i++) {
|
||
|
for (int j = 0; j < i; j++) {
|
||
|
if (x[j] < x[i] && len[i] < len[j] + 1) {
|
||
|
len[i] = len[j] + 1;
|
||
|
pred[i] = j;
|
||
|
}
|
||
|
}
|
||
|
if (len[bi] < len[i]) {
|
||
|
bi = i;
|
||
|
}
|
||
|
}
|
||
|
int cnt = len[bi];
|
||
|
int[] res = new int[cnt];
|
||
|
for (int i = bi; i != -1; i = pred[i]) {
|
||
|
res[--cnt] = x[i];
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
// Usage example
|
||
|
public static void main(String[] args) {
|
||
|
int[] a = { 1, 5, 4, 2, 3, 7, 6 };
|
||
|
int[] lis = getLis(a);
|
||
|
System.out.println(Arrays.toString(lis));
|
||
|
}
|
||
|
}
|