forked from rampatra/Algorithms-and-Data-Structures-in-Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLongestIncreasingSubsequence.java
61 lines (54 loc) · 2.1 KB
/
LongestIncreasingSubsequence.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package me.ramswaroop.dynamicprogramming;
/**
* Created by IntelliJ IDEA.
*
* @author: ramswaroop
* @date: 9/29/15
* @time: 10:15 PM
*/
public class LongestIncreasingSubSequence {
/**
* TODO: Properly document and understand
* The Longest Increasing SubSequence (LIS) problem is to find the length of
* the longest sub-sequence of a given sequence such that all elements of the
* sub-sequence are sorted in increasing order.
*
* For example,
* Length of LIS for { 10, 22, 9, 33, 21, 50, 41, 60, 80 } is 6 and LIS
* is {10, 22, 33, 50, 60, 80}.
*
* Optimal Substructure:
* Let arr[0..n-1] be the input array and L(i) be the length of the LIS till index i such that arr[i] is part
* of LIS and arr[i] is the last element in LIS, then L(i) can be recursively written as.
* L(i) = { 1 + Max ( L(j) ) } where j < i and arr[j] < arr[i] and if there is no such j then L(i) = 1
* To get LIS of a given array, we need to return max(L(i)) where 0 < i < n So the LIS problem has optimal
* substructure property as the main problem can be solved using solutions to sub-problems.
*
* @param a
* @return
*/
public static int getLongestIncreasingSubSequenceLength(int[] a) {
int len = a.length, maxLisLength = 0;
int[] lis = new int[len];
for (int i = 0; i < len; i++) {
lis[i] = 1;
}
for (int i = 1; i < len; i++) {
for (int j = 0; j < i; j++) {
if (a[i] > a[j] && lis[i] < lis[j] + 1)
lis[i] = lis[j] + 1;
}
}
for (int i = 0; i < len; i++) {
if (lis[i] > maxLisLength) {
maxLisLength = lis[i];
}
}
return maxLisLength;
}
public static void main(String a[]) {
System.out.println(getLongestIncreasingSubSequenceLength(new int[]{2, 3, 7, 8, 15}));
System.out.println(getLongestIncreasingSubSequenceLength(new int[]{2, 20, 7, 8, 1}));
System.out.println(getLongestIncreasingSubSequenceLength(new int[]{20, 10, 5}));
}
}