#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include <set>
#include <map>
#include<list>
#include <stack>
#include <queue>
#include <vector>
#include <ctime>
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
#define m(a,b) memset(a,b,sizeof(a))
#define MAX 0x3f3f3f3f
const ll MOD=1e+9+7;
using namespace std;
int main()
{
int s[50005],ans[50005];
int n;
int max,maxx=1;
m(s,0);
f(i,0,50003)ans[i]=1;
cin>>n;
cin>>s[0];
f(i,1,n-1){
cin>>s[i];
max=1;
for(int j=i-1;j>=0;j--){
if(s[i]>s[j]&&ans[i]+ans[j]>max&&ans[j]){
max=ans[i]+ans[j];
ans[j]=0;
}
}
ans[i]=max;
if(max>maxx)maxx=max;
}
cout<<maxx<<endl;
return 0;
}
51nod1134最长上升子序列N^2超时
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include <set>
#include <map>
#include<list>
#include <stack>
#include <queue>
#include <vector>
#include <ctime>
#define ll long long
#define f(i,a,b) for(int i=a;i<=b;i++)
#define m(a,b) memset(a,b,sizeof(a))
#define MAX 0x3f3f3f3f
const ll MOD=1e+9+7;
using namespace std;
int BSearch(int a[], int n, int t)
{
int low = 1;
int high = n;
while (low <= high)
{
int mid = (low + high) / 2;
if (t == a[mid])
{
return mid;
}
else if (t > a[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return low;
}
int LIS_BSearch(int a[], int m[], int n)
{
int maxlen = 1;
m[maxlen] = a[1];
int i;
for (i = 2; i <= n; i++)
{
if (a[i] > m[maxlen])
{
m[++maxlen] = a[i];
}
else
{
int p = BSearch(m, maxlen, a[i]);
m[p] = a[i];
}
}
return maxlen;
}
int main()
{
int s[50005],ans[50005];
int n;
int maxx=0;
m(s,0);
cin>>n;
m(ans,0);
f(i,1,n)cin>>s[i];
maxx=LIS_BSearch(s,ans,n);
cout<<maxx<<endl;
return 0;
}