编程训练——最长上升子序列

题目

最长上升子序列问题,长度为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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章