题目描述
给出一个由 n(n≤5000)个不超过 106 的正整数组成的序列。请输出这个序列的最长上升子序列的长度。
最长上升子序列是指,从原序列中按顺序取出一些数字排在一起,这些数字是逐渐增大的。
输入格式
第一行,一个整数 n,表示序列长度。
第二行有 n 个整数,表示这个序列。
输出格式
一个整数表示答案。
输入输出样例
输入 #1复制
6 1 2 4 1 3 4
输出 #1复制
4
说明/提示
分别取出 1、2、3、4 即可。
思路:
定义状态dp[i] 表示一第 i 个 数为结尾的最长递增子序列的长度,那么有
dp[i] =max{ dp[j] } +1 , 0 < i <i , Aj < Ai
最终答案是 max{dp[i] }。
复杂度分析: j 在0~i 滑动 ,复杂度为O(n) ; i 的变化范围也为O(n);总复杂度 O() 。
代码实现:
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
int a[N];
int dp[N];
int ans=0;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;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);
}
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
return 0;
}