题目大意:就是求最长的上升子序列,输出长度。
思路:LIS水题。就是题目描述的特别长。
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 using namespace std; 6 int a[40005]; 7 int dp[40005]; 8 int mx[40005]; 9 int INF=9999999; 10 int main(){ 11 int T; 12 cin>>T; 13 while(T--){ 14 int n; 15 cin>>n; 16 for(int i=1;i<=n;i++) 17 scanf("%d",&a[i]); 18 for(int i=0;i<=40003;i++) 19 mx[i]=INF; 20 mx[0]=0; 21 int len=0; 22 for(int i=1;i<=n;i++){ 23 for(int j=len;j>=0;j--){ 24 if(a[i]>mx[j]){ 25 dp[i]=j+1; 26 mx[j+1]=min(a[i],mx[j+1]); 27 break; 28 } 29 } 30 len=max(len,dp[i]); 31 } 32 cout<<len<<endl; 33 } 34 return 0; 35 }