• (动态规划)4977:怪盗基德的滑翔翼


    描述

    怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。

    有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。

    假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?

    输入

    输入数据第一行是一个整数K(K < 100),代表有K组测试数据。
    每组测试数据包含两行:第一行是一个整数N(N < 100),代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h(0 < h < 10000),按照建筑的排列顺序给出。

    输出

    对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。

    样例输入

    3

    8

    300 207 155 299 298 170 158 65

    8

    65 158 170 298 299 155 207 300

    10

    2 1 3 4 5 6 7 8 9 10

    样例输出

    6

    6

    我の思考

    这个题和拦截导弹很像(传送门:http://noi.openjudge.cn/ch0206/8780/),就是要再反序过来扫一遍。

    就是把问题分解为,求以某个数字为结尾(最小/最大)的串,因为保存的是以它结尾的最大最小串的数字,所以是连贯的。

    可以在原有基础上修改啊。要注意的是~因为要循环进行,所以要记得把变量清空一下~

    我の代码

    #include <iostream>
    #include <algorithm>
    #define _MAX 101
    int max_count=0;
    int dp[_MAX];
    int num[_MAX];
    using namespace std;
    
    int main()
    {
        int k;
        cin>>k;
    
        while(k>0){
            int n;
            cin>>n;
    
            for(int i=1;i<=n;i++){
                cin>>num[i];
                dp[i]=1;
            }
    
            //正序查
            for(int i=2;i<=n;i++){
                for(int j=i-1;j>=1;j--){
                    if(num[i]<=num[j]){
                        dp[i]=max(dp[i],dp[j]+1);
                    }
                    if(dp[i]>max_count){
                        max_count = dp[i];
                    }
                }
            }
    
            //反序查
            for(int i=1;i<=n;i++){
                dp[i]=1;
            }
    
            for(int i=n-1;i>=1;i--){
                for(int j=i+1;j<=n;j++){
                    if(num[i]<=num[j]){
                        dp[i]=max(dp[i],dp[j]+1);
                    }
                    if(dp[i]>max_count){
                        max_count = dp[i];
                    }
                }
            }
    
            cout<<max_count<<endl;
            max_count=0;
            k--;
        }
        return 0;
    }


  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/rimochiko/p/7517504.html
Copyright © 2020-2023  润新知