通过LCS求解
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
int LIS(int a[],int n){
int b[maxn];
for(int i=0;i<n;i++)b[i]=a[i];
int dp[maxn][maxn]={0};
sort(b,b+n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i-1]==b[j-1])dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[n][n];
}
int main(){
int a[maxn],n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
cout<<LIS(a,n)<<endl;
}
直接dp
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
int LIS(int a[],int n){
int dp[maxn]={1},m=0,ans=0;
for(int i=1;i<n;i++){
m = 0;
for(int j=0;j<i;j++)if(dp[j]>m&&a[i]>a[j])m=dp[j];
dp[i]=m+1;
ans = max(ans,dp[i]);
}
return ans;
}
int main(){
int a[maxn],n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
cout<<LIS(a,n)<<endl;
}
O(nlogn)优化
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
int LIS(int a[],int n){
int d[maxn]={0},len=0;
d[len++]=a[0];
for(int i=1;i<n;i++){
if(a[i]>d[len-1]){
d[len++]=a[i];
}
else{
int pos = lower_bound(d,d+len,a[i])-d;
d[pos]=a[i];
}
}
return len;
}
int main(){
int a[maxn],n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
cout<<LIS(a,n)<<endl;
}