From dc8114c17d0664f459d0c59e59a7e6f562530395 Mon Sep 17 00:00:00 2001 From: icalF Date: Fri, 29 Sep 2017 10:47:05 +0700 Subject: [PATCH] Add longest increasing subsequence --- .../LongestIncreasingSubsequence.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Dynamic Programming/LongestIncreasingSubsequence.java diff --git a/Dynamic Programming/LongestIncreasingSubsequence.java b/Dynamic Programming/LongestIncreasingSubsequence.java new file mode 100644 index 00000000..1616c246 --- /dev/null +++ b/Dynamic Programming/LongestIncreasingSubsequence.java @@ -0,0 +1,62 @@ +import java.util.Scanner; + +/** + * + * @author Afrizal Fikri (https://github.com/icalF) + * + */ +public class LongestIncreasingSubsequence { + public static void main(String[] args) throws Exception { + + Scanner sc = new Scanner(System.in); + int n = sc.nextInt(); + + int ar[] = new int[n]; + for (int i = 0; i < n; i++) { + ar[i] = sc.nextInt(); + } + + System.out.println(LIS(ar)); + } + + private static int upperBound(int[] ar, int l, int r, int key) { + while (l < r-1) { + int m = (l + r) / 2; + if (ar[m] >= key) + r = m; + else + l = m; + } + + return r; + } + + public static int LIS(int[] array) { + int N = array.length; + if (N == 0) + return 0; + + int[] tail = new int[N]; + int length = 1; // always points empty slot in tail + + tail[0] = array[0]; + for (int i = 1; i < N; i++) { + + // new smallest value + if (array[i] < tail[0]) + tail[0] = array[i]; + + // array[i] extends largest subsequence + else if (array[i] > tail[length-1]) + tail[length++] = array[i]; + + // array[i] will become end candidate of an existing subsequence or + // Throw away larger elements in all LIS, to make room for upcoming grater elements than array[i] + // (and also, array[i] would have already appeared in one of LIS, identify the location and replace it) + else + tail[upperBound(tail, -1, length-1, array[i])] = array[i]; + } + + return length; + } +} \ No newline at end of file