最长上升子序列
求一个序列的最长上升子序列。
思路
f o r i = 2 … n for\space i=2\space\dots\space n for i=2 … n
d p i = 1 dp_i=1 dpi=1
f o r j = 1 … n for\space j=1\space\dots\space n for j=1 … n
i f a i > a j if\space a_i>a_j if ai>aj d p i = max ( d p [ i ] , d p [ j ] + 1 ) dp_i=\max(dp[i],dp[j]+1) dpi=max(dp[i],dp[j]+1)
代码
#include<iostream>
#include<cstdio>
using namespace std;
int a[100010];
int dp[100010];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
cin>>a[i];
}
dp[1]=1;
for(int i=2;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){
if(a[i]>a[j]){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
int mx=0;
for(int i=1;i<=n;i++){
mx=max(mx,dp[i]);
}
cout<<mx<<endl;
return 0;
}