最长严格递增子序列:
#include <bits/stdc++.h>
using namespace std;
const int MAXX=50000+5;
const int INF=INT_MAX;
int a[MAXX],dp[MAXX]; // a数组为数据,dp[i]表示长度为i+1的LIS结尾元素的最小值
int main()
{
int n;
while(cin>>n)
{
for(int i=0; i<n; i++)
{
cin>>a[i];
dp[i]=INF; // 初始化为无限大
}
int pos=0; // 记录dp当前最后一位的下标
dp[0]=a[0]; // dp[0]值显然为a[0]
for(int i=1; i<n; i++)
{
if(a[i]>dp[pos]) // 若a[i]大于dp数组最大值,则直接添加
dp[++pos] = a[i];
else // 否则找到dp中第一个大于等于a[i]的位置,用a[i]替换之。
dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i]; // 二分查找
}
cout<<pos+1<<endl;
}
return 0;
}
n^2复杂度
#include<bits/stdc++.h>
using namespace std;
int a[100]= {0};
int dp[100]= {0};
int main()
{
int i,j,n,m;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
for(i=0; i<n; i++)
dp[i]=1;
for( i=0; i<n; i++)
scanf("%d",&a[i]);
for( j=1; j<n; j++)
{
for( i=0; i<j; i++)
{
if(a[i]<a[j])
{
dp[j]=max(dp[i]+1,dp[j]);
}
}
}
sort(dp,dp+n);
printf("%d\n",dp[n-1]);
}
return 0;
}