223. 最長上升子序列問題(挑戰程序設計競賽)

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

我的視頻題解空間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章