博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vijos P1571 笨笨的导弹攻击【最长上升子序列+DP】
阅读量:6243 次
发布时间:2019-06-22

本文共 1168 字,大约阅读时间需要 3 分钟。

背景

在那遥远的地方,有个小目标~~

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

描述

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

每个导弹有各自的编号,这些编号有可能重复……

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

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

格式

输入格式

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

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

输出格式

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

样例1

样例输入1

45 3 2 4

样例输出1

3

限制

1s

来源

经典DP

问题链接

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

程序说明:(略)

题记:(略)

参考链接

AC的C++程序如下:

#include
#include
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\n", ans); } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7563707.html

你可能感兴趣的文章
MYSQLDUMP参数详解(转)
查看>>
SLA
查看>>
MyProject / FuzzyPages | Elias的个人主页
查看>>
三子棋局-挑战你的逻辑思维
查看>>
Linux 安装 MySQL / MySQL 主从备份
查看>>
python调用linux shell脚本,并返回结果一例
查看>>
IT的一些常识
查看>>
无边框Winform 简单实现拖动
查看>>
潜移默化学会WPF--Border,焦点移动
查看>>
css解决span宽度问题
查看>>
调频广播六十年
查看>>
android sdk 如何重新生成debug.keystore
查看>>
黑马程序员-JAVA基础-练习之存储学生信息
查看>>
基于FPGA的跨时钟域信号处理——同步设计的重要
查看>>
【SAP HANA】关于SAP HANA中Analytic View创建、激活状况下在系统中生成对象的研究...
查看>>
ubuntu 12.04 ubuntu System program problem detected 解决方法
查看>>
c++智能指针《一》 auto_ptr
查看>>
我的代码观——关于ACM编程风格与librazy网友的对话
查看>>
Linux 总结2
查看>>
mysql C++ 使用
查看>>