朴素算法
https://www.acwing.com/problem/content/897/
我们来写一下题解
//我们再来看一下这个题目的解法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int a[N];//用来存入这些数字
int f[N];//表示以i结尾的最长上升子序列的长度
int n;
int main()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
//开始以每个数字结尾的f[i]赋值为1
for(int i=1;i<=n;i++)
{
f[i]=1;
}
int ans=0;
//接下来进行我们这里的计算
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(a[i]>a[j])
{
f[i]=max(f[i],f[j]+1);
}
}
ans=max(ans,f[i]);
}
cout << ans<<endl;
return 0;
}
二分查找法
https://www.acwing.com/problem/content/898/
题解
//接下来我们讲一下最长上升子序列
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int b[N];//用来存入这里的最长上升子序列
int n;
int len;
int find(int x)
{
int l=1,r=len,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(x>b[mid])
{
l=mid+1;
}
else
{
r=mid-1;
}
}
return l;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
b[1]=a[1];
len=1;
for(int i=2;i<=n;i++)
{
if(a[i]>b[len])
{
b[++len]=a[i];
}
else//二分查找一下这里的大于a[i]的最小的b[i]
{
int j=find(a[i]);
b[j]=a[i];
}
}
cout<<len<<endl;
return 0;
}