zoukankan      html  css  js  c++  java
  • 最长不下降子序列

    例子:openjudge 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
    9

    我先不说什么,先把酱料弄上来
    #include <bits/stdc++.h>
    #define fp(i,l,r) for(register int i=(l);i<=(r);i++)
    #define fd(i,l,r) for(register int i=(l);i>=(r);i--)
    using namespace std;
    inline int bothposs(int a,int b,int pd){
        if(pd==1) return a>b?a:b;
        if(pd==0) return a>b?b:a;
    }
    int main(){
        int n;
        int sum=0,ans=0;
        int bu[100+20]={1};
        int fi[100+20];
        int all;
        scanf("%d",&all);
        fp(k,1,all){
            scanf("%d",&n);
            fp(i,1,n){
                scanf("%d",&bu[i]);
                fi[i]=1;
            }
            fd(i,n-1,1){
                fp(j,i+1,n){
                    if(bu[i]<=bu[j]){
                        fi[i]=bothposs(fi[i],fi[j]+1,1);
                    }
                }
            }
            fp(i,1,n){
                sum=bothposs(sum,fi[i],1);
            }
            fp(i,1,120){
                fi[i]=1;
            }        
            fd(i,n-1,1){
                fp(j,i+1,n){
                    if(bu[i]>=bu[j]){
                        fi[i]=bothposs(fi[i],fi[j]+1,1);
                    }
                }
            }
            fp(i,1,n){
                ans=bothposs(ans,fi[i],1);
            }
            printf("%d
    ",bothposs(ans,sum,1));
            sum=0;
            ans=0;
        }
        return 0;
    }
    代码酱

    补充中---

  • 相关阅读:
    UVa 10118 记忆化搜索 Free Candies
    CodeForces 568B DP Symmetric and Transitive
    UVa 11695 树的直径 Flight Planning
    UVa 10934 DP Dropping water balloons
    CodeForces 543D 树形DP Road Improvement
    CodeForces 570E DP Pig and Palindromes
    HDU 5396 区间DP 数学 Expression
    HDU 5402 模拟 构造 Travelling Salesman Problem
    HDU 5399 数学 Too Simple
    CodeForces 567F DP Mausoleum
  • 原文地址:https://www.cnblogs.com/Fraction/p/8405431.html
Copyright © 2011-2022 走看看