最长上升子序列
传送门
题意
对于给定的一个n个数的序列,找到它的一个最长的子序列,并且保证这个子序列是由低到高排序的。
例如,1 6 2 5 4 6 8的最长上升子序列为1 2 4 6 8。
基本思路
非常显然,这类题用dp求解。 dp[i]表示已i为结尾的最长上升子序列的长度,首先枚举每一个末尾i,然后枚举从1到i-1,如果a[1...i-1]<a[i]说明满足上升子序列,就加上一后取max。
附上代码。
1 //LIS O(n^2) 2 #include<iostream> 3 using namespace std; 4 int dp[100005],a[100005],n,maxx=-999; 5 int main(){ 6 cin>>n; 7 for(int i=1;i<=n;i++) cin>>a[i],dp[i]=1; 8 for(int i=1;i<=n;i++){ 9 for(int j=1;j<i;j++){ 10 if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);//如果后面的大于前面的,就取较大的值。 11 } 12 maxx=max(maxx,dp[i]); //每次更新最大值 13 } 14 cout<<maxx; 15 return 0; 16 }