編程訓練——最長上升子序列

題目

最長上升子序列問題,長度爲n的數列,求出其中最長上升子序列的長度。
上升子序列就是單調非減的子數列。

樣例輸入

5
4 2 3 1 5

輸入序列的長度和序列。

樣例輸出

3

序列中的最長子序列是2、3、5,長度爲3.

算法

dp[i]dp[i]表示以aia_i爲結尾的最長上升子序列LIS的長度,其有兩種可能:
1,只包含aia_i的LIS;
2,對於所有0j<i0≤j<i,若a[j]<a[i]a[j]<a[i],則dp[i]dp[j]+1dp[i]≥dp[j]+1.
綜上,dp[i]=max{1,dp[j]+10j<ia[j]<a[i]}dp[i]=max\{1,dp[j]+1|對於所有0≤j<i且a[j]<a[i]\}

最後輸出dpdp數組中的最大值。

代碼

#include<stdio.h>

#define maxn 1005

int max(int a, int b){
    return (a>b)?a:b;
}

int main(){
    int n;
    int a[maxn], dp[maxn];
    while(scanf("%d", &n)==1){
        int res = 0, temp = 0;
        for(int i = 0;i < n;i++){
            scanf("%d", a + i);
        }
        for(int i = 0;i < n;i++){
            dp[i] = 1;
            for(int j = 0;j < i;j++){
                if(a[j]<a[i]){
                    temp = max(temp, dp[j]+1);
                }
            }
            dp[i] = max(temp, dp[i]);
            res = max(dp[i], res);
        }
        printf("%d\n", res);
    }

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