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;
}

猜你喜欢

转载自blog.csdn.net/zhaobaole2018/article/details/84889753