package com.interview.algorithms.dp;
/**
* Created_By: zouzhile
* Date: 3/14/14
* Time: 5:39 PM
*
* Given a sequence of N numbers - A[1] , A[2] , ..., A[N] .
* Find the length of the longest non-decreasing sequence.
* and print out the sequence
*
* optimal[S] = max{ optimal[i] + 1 if A[i] < A[S] } for all 1 - S-1
*/
public class C12_3_LongestIncreasingSequence {
public int[] getLengthOfLongestIncreasingSequence(int[] values) {
int max = 0;
int[] optimal = new int[values.length];
int[] seq = new int[values.length];
for(int i = 0; i < optimal.length; i ++) {
optimal[i] = 1;
seq[i] = i;
}
for(int i = 1; i < optimal.length; i ++) {
for(int j = 0; j < i; j ++ ) {
if(values[j] < values[i])
if(optimal[j] + 1 > optimal[i]) {
optimal[i] = optimal[j] + 1;
seq[i] = j;
if(optimal[i] > optimal[max]) max = i;
}
}
}
//backtrace the result
int[] result = new int[optimal[max]];
int current = max;
for(int i = result.length - 1; i >= 0; i-- ){
result[i] = values[current];
current = seq[current];
}
return result;
}
}