1、B站视频链接:E03 线性DP 最长上升子序列_哔哩哔哩_bilibili
#include <bits/stdc++.h>
using namespace std;
int n=9;
int a[101]={0,5,7,1,9,4,6,2,8,3};
int f[101];
//f[i]表示以a[i]为结尾的
//最长上升子序列的长度
int main(){
int i,j,ans=1;
for(int i=1;i<=n;i++){
f[i]=1;//初始化f[i]即自身长度为一的序列
}
//动态更新f[i] //i,j双指针扫描
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>a[j]){
f[i]=max(f[j]+1,f[i]);//长度加一或者不变
}
}
ans=max(ans,f[i]);
}
//输出最长长度
printf("%d\n",ans);
return 0;
}
2、B站视频链接:E04 线性DP 最长上升子序列 二分优化_哔哩哔哩_bilibili
注意:b数组存储的并不是最长上升子序列2567,b数组仅能得出最长上升子序列的长度
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,a[N];
int len,b[N];
int find(int x){
int l=-1,r=len;
while(l+1<r){
int mid=l+r>>1;
if(b[mid]>=x)r=mid;
else l=mid;
}
return r;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>a[i];
}
b[0]=-2e9;
for(int i=0;i<n;i++){
if(b[len]<a[i]){
b[++len]=a[i];
}else{
b[find(a[i])]=a[i];
}
}
cout<<len<<endl;
return 0;
}