有一个长度为n的数列{a0,a1,a2…an-1},求最长上升子序列的长度。
输入:
5
4 2 3 1 5
输出:
3
dp[i] 以 a[i] 结尾的最长上升子序列的长度
dp[i]=1;
for(int j=0;j
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int dp[100];//以i结尾的最长上升子序列的长度
int main(){
int n,a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int res=0;
for(int i=0;i<n;i++){
dp[i]=1;
for(int j=0;j<i;j++){
if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1);
}
res=max(dp[i],res);
}
cout<<res;
return 0;
}
改进版:
dp[i] :长度为i的序列的最后一个数
dp[i]肯定是递增的。
将比a[i]大的位置 dp[j]=a[i]
如果没有的话(说明都比a[i]小),长度加1处=a[i];
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int INF = 100000;
int dp[1000];//长度为i的序列的最后一个数
int main(){
int n,a[100];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
fill(dp,dp+n,INF);
for(int i=0;i<n;i++){
*lower_bound(dp,dp+n,a[i])=a[i];//返回》=a[i]的最小的数的位置
}
cout<<lower_bound(dp,dp+n,INF)-dp;
return 0;
}