veronikaaa86

Longest Increasing Subsequence

Feb 11th, 2018
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.86 KB | None | 0 0
  1. package Lists;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.Collections;
  9. import java.util.List;
  10. import java.util.stream.Collectors;
  11.  
  12. public class P04_LongestIncreasingSubsequence {
  13.     public static void main(String[] args) throws IOException {
  14.         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  15.  
  16.         int[] sequence = Arrays.stream(reader.readLine()
  17.                 .split("\\s+"))
  18.                 .mapToInt(Integer::parseInt)
  19.                 .toArray();
  20.  
  21.         List<Integer> longestSeq = findLongestIncreasingSubsequence(sequence);
  22.         List<String> stringList = longestSeq.stream().map(Object::toString).collect(Collectors.toList());
  23.         System.out.printf("%s", String.join(" ", stringList));
  24.     }
  25.  
  26.     public static List<Integer> findLongestIncreasingSubsequence(int[] sequence) {
  27.         int[] length = new int[sequence.length];
  28.         int[] prev = new int[sequence.length];
  29.         int maxLength = 0;
  30.         int lastIndex = -1;
  31.  
  32.         for (int i = 0; i < sequence.length; i++) {
  33.             length[i] = 1;
  34.             prev[i] = -1;
  35.  
  36.             for (int j = 0; j < i; j++) {
  37.                 if(sequence[j] < sequence[i] && length[j] >= length[i]) {
  38.                     length[i] = 1 + length[j];
  39.                     prev[i] = j;
  40.                 }
  41.             }
  42.  
  43.             if(length[i] > maxLength) {
  44.                 maxLength = length[i];
  45.                 lastIndex = i;
  46.             }
  47.         }
  48.  
  49.         List<Integer> longestSeq = new ArrayList<>();
  50.         for (int i = 0; i < maxLength; i++) {
  51.             longestSeq.add(sequence[lastIndex]);
  52.             lastIndex = prev[lastIndex];
  53.         }
  54.         Collections.reverse(longestSeq);
  55.  
  56.         return longestSeq;
  57.     }
  58. }
Advertisement
Add Comment
Please, Sign In to add comment