poj 2757:最長上升子序列 動規

題目

描述
一個數的序列bi,當b1 < b2 < … < bS的時候,我們稱這個序列是上升的。對於給定的一個序列(a1, a2, …, aN),我們可以得到一些上升的子序列(ai1, ai2, …, aiK),這裏1 <= i1 < i2 < … < iK <= N。比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。這些子序列中最長的長度是4,比如子序列(1, 3, 5, 8).

你的任務,就是對於給定的序列,求出最長上升子序列的長度。
輸入
輸入的第一行是序列的長度N (1 <= N <= 1000)。第二行給出序列中的N個整數,這些整數的取值範圍都在0到10000。
輸出
最長上升子序列的長度。
樣例輸入
7
1 7 3 5 9 4 8
樣例輸出
4
http://bailian.openjudge.cn/practice/2757/

思路

找到能遞推的子問題是解決動規的關鍵。第n項的最大長度是前n-1項中小於第n項的最大長度加一。而整體最大值是需要通過比較全部的n項的值才能得出。

#include <stdio.h>
#include <algorithm>
using namespace std;

int N,last[1005],n[1005];

int main()
{
    //freopen("1.txt","r",stdin);
    scanf("%d",&N);
    last[0] =1;
    for(int i=0;i<N;i++){
        scanf("%d",&(n[i]));
    }

    for(int i=1;i<N;i++){
            last[i] =1;
        for(int j=i-1;j>=0;j--){
            if(n[j]<n[i]){
                last[i]=max(last[i],last[j]+1);
            }
        }
    //printf("i=%d len=%d\n",i,last[i]);
    }
    int m = -1;
    for(int i=0;i<N;i++){
        m = max(m,last[i]);
    }
    printf("%d",m);
    return 0;
}

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