POJ 2533 Longest Ordered Subsequence 動態規劃 最長上升子序列

解題報告:

思路:定義dp[i]爲num[i]結尾的最長上升子序列的長度,它可以由dp[1...j-1]轉移過來,當然要滿足num[i] > num[j],最後對dp數組求最大值,因爲最長上升子序可能出現在以任意num[i]結尾的序列中。

代碼:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef long long ll;

const ll N = 1e3 + 10;

ll dp[N];
ll num[N];
ll n;

void solve(){
    for(ll i=1; i<=n; ++i){
        dp[i] = 1;
    }
    for(ll i=2; i<=n; ++i){
        for(ll j=1; j<i; ++j){
            if(num[i] > num[j]){
                dp[i] = max(dp[j] + 1, dp[i]);
            }
        }
    }
    ll maxn = 0;
    for(ll i=1; i<=n; ++i){
        maxn = max(maxn, dp[i]);
    }
    printf("%lld\n", maxn);
}

int main(){
    scanf("%lld", &n);
    for(ll i=1; i<=n; ++i){
        scanf("%lld", num + i);
    }
    solve();
    return 0;
}

 

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