地址 https://www.papamelon.com/problem/223
有一个长为 n 的序列 a_0, a_1,...,a_n 。
求出这个序列的最长上升子序列的长度。
上升子序列指的是对于任意的 i<j 都满足 a_i < a_j子序列。
输入
第一行为一个整数 n
第二行有 n 个整数表示序列 a
1≤n≤1000
1≤ai≤10^6
输出
一个整数,表示最长上升子序列的长度
样例 1
输入
5
4 2 3 1 5
输出
3
解答 动态规划
使用dp[i]记录 数组第i个数字能达到的上升子序列最大长度。
由于要知道i之后的数字是否能加入这个上升子序列,所以dp[i]的意义应该是数组第i个数字结尾的最大上升子序列的长度。
这样对于数组后面的数字i+1,i+2~~~~~n; 如果a[i+1]>a[i] 那么dp[i+1] = max(dp[i+1],dp[i]+1)
时间复杂度O(n^2)
代码如下
#include <iostream>
#include <memory.h>
using namespace std;
const int N = 1010;
int dp[N];
int a[N];
int n;
int main(){
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=0;j<i;j++){
if(a[i] > a[j]){
dp[i]= max(dp[i],dp[j]+1);
}
}
}
int ans = 1;
for(int i = 1;i <=n;i++){
ans = max(ans,dp[i]);
}
cout << ans<<endl;
return 0;
}