#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>usingnamespace std;int num[100000+10];int dp[100000+10];intmain(){int n;scanf("%d",&n);for(int i =0; i < n; i ++){scanf("%d",&num[i]);}int ans =0;for(int i =0; i < n; i ++){
dp[i]=1;for(int j =0; j < i; j ++){if(num[j]<= num[i]){
dp[i]=max(dp[i], dp[j]+1);}}
ans =max(ans, dp[i]);}printf("%d\n", ans);return0;}
贪心+二分
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<algorithm>usingnamespace std;int arr[100000+10];int ans[100000+10];int len;intbinary_search(int x){int l =0, r = len, mid;while(l < r){
mid = l + r >>1;if(ans[mid]>= arr[x]) r = mid;else l = mid +1;}return l;}intmain(){int n;scanf("%d",&n);for(int i =0; i < n; i ++){scanf("%d",&arr[i]);}
ans[0]= arr[0];
len =0;for(int i =1; i < n; i ++){if(arr[i]> ans[len]) ans[++ len]= arr[i];else{int pos =binary_search(i);
ans[pos]=min(ans[pos], arr[i]);}}printf("%d", len +1);return0;}