15.4.5
设原来序列为N1, 排序后的序列为N2, 它们的LCS就是所求解。因为如果N1有另一个最长的单调递增序列,那它必然出现在N2中且不等于LCS,与假设矛盾。
所以LCS就是最长的单调递增序列。
public static int[] findMonoIncreasingNumberSequence(int[] original,int[][] maxLength){
int result[] = null;
int size = original.length;
// Copy the integer array
int[] sorted = original.clone();
// Quick Sort, which takes O(N*lgN)
Arrays.sort(sorted, 1, size);
for(int i=0;i<size;i++){
maxLength[0][i] =0;
}
for(int i=0;i<size;i++){
maxLength[i][0] =0;
}
// DP, finding the LCS of the original and sorted number sequence.
// It takes O(N*N)
for(int i=1;i<size;i++){
for(int j=1;j<size;j++){
if(sorted[i] == original[j]){
maxLength[i][j] = maxLength[i-1][j-1] + 1;
}else if(maxLength[i-1][j] >= maxLength[i][j-1]){
maxLength[i][j] = maxLength[i-1][j];
}else{
maxLength[i][j] = maxLength[i][j-1];
}
}
}
int resultSize = maxLength[size-1][size-1];
result = new int[resultSize];
int i=original.length-1;
int j=original.length-1;
// Find an optimal solution.
while(i>0 && j>0){
if(sorted[i] == original[j]){
resultSize--;
result[resultSize] = sorted[i];
i = i-1;
j = j-1;
}else if(maxLength[i-1][j] >= maxLength[i][j-1]){
i = i -1;
}else{
j = j-1;
}
}
return result;
}
==========测试================
public static void main(String[] args) {
int[] numberSequence = new int[]{Integer.MIN_VALUE,2,3,6,1,4};
int size = numberSequence.length;
int[][] maxLength = new int[size][size];
int[] result = findMonoIncreasingNumberSequence(numberSequence,maxLength);
for (int i : result) {
System.out.print(i);
}
}