如题,代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int n =10;
int a[] = {1,2,3,5,4,7,9,6,10,8};
int dp[n]; //dp[i]表示长度为i+1的上升子串中末尾元素的最小值
int len[n];//len[i]表示以a[i]结尾的上升子串长度
int maxLen;//最长子串的长度
void LIS()
{
fill(dp,dp+n,INT_MAX);
for(int i = 0; i < n; i++){
*lower_bound(dp,dp+n,a[i]) = a[i];
len[i] = (lower_bound(dp,dp+n,a[i]) - dp) + 1;
}
maxLen = lower_bound(dp,dp+n,INT_MAX)-dp;
printf("%d\n",maxLen);
}
void printLIS()
{
int length = 1;
for(int i = 0; i < n; i++){
if(len[i] == length ){
cout << a[i] << " ";
++length;
}
}cout << endl;
}
int main()
{
LIS();
printLIS();
return 0;
}