1. 程式人生 > >SDNUOJ 1292 動態規劃之LDS(最長下降子序列)

SDNUOJ 1292 動態規劃之LDS(最長下降子序列)

Description
昨天是平安夜,聖誕老人從房頂上的煙囪裡爬到小朋友床邊把禮物送給夢鄉中的小朋友,但是今年的聖誕老人是處女座的,他有很嚴重的強迫症,他從一條街的一端開始,每次送禮物進的煙囪都不能比之前進的煙囪高,而且他還想要送出最多的禮物。
Input
輸入資料只有一行,該行包含若干個資料,表示一條街上的煙囪高度(煙囪最多有 20 枚,高度h≤1000000)。
Output
聖誕老人最多送出多少禮物。
Sample Input
315 199 155 301 215 170 150 25
Sample Output
6

#include<bits/stdc++.h>
using namespace std;

int cmp(int a, int b)
{
    return a > b;
}

int main()
{
    int s[25];///存:序列各元素
    int dp[25];///存:到第i個元素為止最長單調子序列的長度(i從0開始)
    memset(s, 0, sizeof(s));
    memset(dp, 0, sizeof(dp));
    int k = 0;
    int a;
    while(cin >> a)
    {
        s[k] = a;
        k++;
    }
    int ans = 0;
    for(int i = 0; i < k; i++)///從頭開始
    {
        dp[i] = 1;///先初始化為1
        for(int j = 0; j < i; j++)///遍歷它(第i個元素)前面的所有元素
        {
            if(s[i] <= s[j])///這裡找的是“遞減”
            {
                ///像揹包一樣,兩種取捨,前者為“不將此元素加入曾經的最佳子序列”
                ///後者為“將此元素加入曾經的最佳子序列,結果在其基礎上加一”
                dp[i] = max(dp[i], dp[j] + 1);
                ///由於是動態規劃,之前的每一個dp都是當時最優解,現在的dp便是當前最優解
            }
        }
//        ans = max(ans, dp[i]);
    }
    ///輸出方式一
//    cout << ans ;
//    cout << '\n';
    ///輸出方式二
//    for(int i = 0; i < k; i++)
//    {
//        cout << dp[i] << " ";
//    }
//    cout << '\n';
    sort(dp, dp + k, cmp);
    cout << dp[0];
    return 0;
}