子序列在原序列中可以是不连续的
动态规划求解:
//时间复杂度 n*n
//令c[i]表示:在a[0->i]中,当以a[i]为单调递增子序列最后一个元素时,所得最长单调递增子序列的长度。
状态转移方程:
c[0]=1;
c[i]=max{1,c[j]+1} a[j]<a[i]&&j<i;
int LongestIncr(int X[], int n, int c[], int line[]) { int path[MAX]; //假设路径都是从自己开始,即元素i前的元素的编号为自己 for (int i = 0; i < n;++i) { path[i] = i; } c[0] = 1; //状态转移 for (int i = 1; i < n; ++i) { c[i] = 1; for (int j = 0; j < i; ++j) { //i加入子序列 if (X[i]>X[j] && c[j]+1>c[i]) { c[i] = c[j] + 1; path[i] = j; //i前的序号值 } } } //得到最长子序列的长度值 int nmax = 0; int end = -1; for (int i = 0; i < n; ++i) { if (c[i]>nmax) { nmax = c[i]; end = i; } } int k = 1; line[0] = X[end];//倒序的... while (path[end]!=end) { line[k++] = X[path[end]]; end = path[end]; } return nmax; } int main() { int n; int X[MAX]; int c[MAX]; int line[MAX]; while (cin >> n, n != 0) { for (int i = 0; i < n; ++i) { cin >> X[i]; } int max = LongestIncr(X, n, c, line); cout << "Longest Increasing Subsequence's Length: " << max << endl; for (int i = max - 1; i >= 0; --i) { cout << line[i]; } cout << endl; } }