#include <iostream> using namespace std; //int num[8]={0,0,3,1,2,4,1,5};//原始序列 int num[8]={0,1,3,4,2,5,6,7}; int d[8];//保存最长递增子序列的元素,第二种方法,复杂度低 int dp[8];//第一种方法,复杂度高,dp[i]存储从num[1]到num[i]之间最长递增子序列的长度,num[i]一定在里边 int BinSearch(int key,int i,int low,int high)//二分搜索,找到road[i]在d[]数组中的位置 { int l=low,r=high; while(l<=r) { int mid=(l+r)/2; if(num[i]<=d[mid]) r=mid-1; else l=mid+1; } return l; } int LIS() { d[1]=num[1]; int len=1;//最长递增子序列的元素个数 int j; for(int i=2;i<=7;i++) { if(d[len]<num[i]) j=++len; else j=BinSearch(num[i],i,1,len); d[j]=num[i]; } return len;//d[]数组中保存的原始序列中的最长递增子序列的元素个数 } /*int LIS(int num[],int n) { int ans=1; int m; dp[1]=1; for(int i=2;i<=n;i++) { m=0; for(int j=1;j<i;j++) { if(dp[j]>m&&num[j]<num[i]) m=dp[j]; } dp[i]=m+1; if(dp[i]>ans) ans=dp[i]; } return ans; }*/ int main() { //第二种方法,复杂度低,二分搜索,可以保存最长递增子序列的元素 int len=LIS(); cout<<len<<endl; for(int i=1;i<=len;i++) cout<<d[i]<<endl;//输出原始序列中构成最长递增子序列的元素。*/ //第一种方法,复杂度高,只能返回最长递增子序列的长度 /*int len=LIS(num,7); cout<<len<<endl; for(int i=1;i<=7;i++) cout<<dp[i]<<endl;*/ return 0; }