zoukankan      html  css  js  c++  java
  • Vijos P1571 笨笨的导弹攻击【最长上升子序列+DP】

    背景

    在那遥远的地方,有个小目标~~
    笨笨:导弹准备!
    路人甲:(这么小个目标都要欺负……)老大,导弹只有一部分可以用……
    笨笨:不管那么多,有多少就打多少!

    描述

    为了彻底打击目标,笨笨要使用足够多的导弹去打击目标。

    每个导弹有各自的编号,这些编号有可能重复……
    现在需要将其中一部分导弹按顺序抽调出来并按原顺序排列,使得这些被抽取出来的导弹奇数位置的编号大于其前一个的编号,偶数位置的编号小于其前一个的编号,这样子才能够正常使用这些导弹攻击目标。

    笨笨想知道,他最多能够正常使用多少导弹攻击目标?

    格式

    输入格式

    第一行一个数n(0<n<=10000),表示导弹总数。

    第二行n个数,按顺序表示各个导弹的编号。

    输出格式

    输出只有一个数,即最多能正常攻击的导弹总数。

    样例1

    样例输入1

    4
    5 3 2 4
    

    样例输出1

    3
    

    限制

    1s

    来源

    经典DP



    问题链接Vijos P1571 笨笨的导弹攻击

    问题分析:这是一个最长上升子序列变形的问题。

    程序说明:(略)

    题记:(略)

    参考链接POJ2533 Longest Ordered Subsequence【最长上升子序列+DP】


    AC的C++程序如下:

    #include<iostream>
    #include<cstdio>
    
    using namespace std;
    
    const int N = 10000;
    int a[N+1], dp[N+1];
    
    int main()
    {
        int n;
        while (scanf("%d", &n) != EOF) {
            int ans = 1;
            for (int i=1; i<=n; i++)
                scanf("%d", &a[i]);
    
            dp[1] = a[1];
            for (int i=2; i<=n; i++) {
                if (ans % 2) {
                    if (a[i] >= dp[ans])
                        dp[ans] = a[i];
                    else
                        dp[++ans] = a[i];
                } else {
                    if (a[i] <= dp[ans])
                        dp[ans] = a[i];
                    else
                        dp[++ans] = a[i];
                }
            }
            printf("%d
    ", ans);
        }
    
        return 0;
    }







  • 相关阅读:
    实验二 递归下降语法分析
    作业十一
    第七次作业逻辑回归实践
    机器学习第六次作业
    第五次作业
    第三次作业k均值算法
    第二次作业
    机器学习作业一
    14次作业
    12 实验二 递归下降语法分析
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563707.html
Copyright © 2011-2022 走看看