演算法 求一個數組的最長遞減子序列 C
阿新 • • 發佈:2018-11-07
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
//**************************************************************************************************** //// 求一個數組的最長遞減子序列 - C++ - by Chimomo//// 題目: 求一個數組的最長遞減子序列,比如{8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}的最長遞減子序列為{14,8,3,2,1}。//// Answer: Scan from left to right, maintain a decreasing sequence. For each number, binary search in the decreasing sequence to see whether it can be substituted. ////****************************************************************************************************#include <iostream>#include <cassert>#include <stack>using namespace std ;int BinarySearch(int *A, int nTarget, int nLen);// Find the longest decreasing sequence in array A of length nLen. void FindLongestDecreasingSequence(int *A, int nLen){ int *index = new int[nLen]; int *LDS = new int[nLen]; index[0] = A[0]; LDS[0] = 1; int indexLen = 1; for (int i = 1; i < nLen; i++) { int pos = BinarySearch(index, A[i], indexLen); index[pos] = A[i]; LDS[i] = pos + 1; if(pos >= indexLen) { indexLen++; } } int ResultLen = indexLen; for (int i = nLen; i >= 0; i--) { if(LDS[i] == ResultLen) { index[ResultLen - 1] = A[i]; ResultLen--; } } for (int i = 0; i < indexLen; i++) { cout << index[i] << " "; } delete [] index;}// Binary search nTarget in array A of length nLen.int BinarySearch(int *A, int nTarget, int nLen){ assert(A != NULL && nLen > 0); int start = 0; int end = nLen - 1; while (start <= end) { int mid = (start + end) / 2; if(nTarget > A[mid]) { end=mid-1; } else if(nTarget<A[mid]) { start=mid+1; } else { return mid; } } return start;}int main(){ int A[] = {8, 14, 6, 2, 8, 14, 3, 2, 7, 4, 7, 2, 8, 101, 23, 6, 1, 2, 1, 1}; int nLen = sizeof(A) / sizeof(int); FindLongestDecreasingSequence(A, nLen); return 0;}// Output:/*14 8 7 6 2 1*/