最长上升子序列
O(n^2)
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=1005;
int a[N],dp[N];
int main()
{
int n,ans=-1;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]>a[j])
dp[i]=max(dp[i],dp[j]+1);
}
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}
O(nlog(n))
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f
const int N=1005;
int a[N],dp[N];
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=inf;
}
int pos=0;
dp[0]=a[0];
for(int i=1;i<n;i++)
{
if(a[i]>dp[pos])
dp[++pos]=a[i];
else
dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i];
}
printf("%d\n",pos+1);
return 0;
}
注:
lower_bound(),从begin开始,到end-1,二分查找第一个大于等于num的数字,返回该数字地址。
upper_bound(),从begin开始,到end-1,二分查找第一个大于num的数字,返回该数字地址。
upper_bound()可用于求最长不下降子序列。