地址 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;
}