AcWing 187. 导弹防御系统 (LIS + dfs)

简介: 笔记

187. 导弹防御系统


题意

为了对抗附近恶意国家的威胁,R 国更新了他们的导弹防御系统。


一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。


例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。


给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。


思路

和 AcWing 1010. 拦截导弹 很类似的一题 唯一不同的是不仅可以选择上升子序列 也可以选择下降子序列


因为数据非常的小 所以我们选择爆搜 对于每一个元素 分为两种情况


一种是选择把它放到结尾元素小于当前数的最大的上升子序列中


另一种是放到结尾元素大于当前数的最小的下降子序列中


注意每次搜完之后要恢复现场


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
const int N = 6000;
int n;
int a[N], up[N], down[N];
int res;
void dfs(int u, int su, int sd) {
  if (su + sd >= res)return;
  if (u == n) {
    res = su + sd;
    return;
  }
  //第一种情况 将当前数放在上升子序列后面
  int k = 1;
  while (k <= su && a[u] <= up[k])k++;
  int t = up[k];
  up[k] = a[u];
  if (k <= su)dfs(u + 1, su, sd);
  else dfs(u + 1, su + 1, sd);
  up[k] = t;
  //第二种情况 将当前数放在下降子序列后面
  k = 1;
  while (k <= sd && a[u] >= down[k])k++;
  t = down[k];
  down[k] = a[u];
  if (k <= sd)dfs(u + 1, su, sd);
  else dfs(u + 1, su, sd + 1);
  down[k] = t;
}
void solve() {
  while (cin >> n, n) {
    for (int i = 0; i < n; ++i)scanf("%d", a + i);
    res = INF;
    dfs(0, 0, 0);
    cout << res << endl;
  }
}
int main() {
  //int t; cin >> t;
  //while (t--) 
  solve();
  return 0;
}


目录
相关文章
|
5月前
【每日一题Day332】LCP 06. 拿硬币 | 模拟
【每日一题Day332】LCP 06. 拿硬币 | 模拟
33 0
力扣.300(一个比较隐蔽的dp)
力扣.300(一个比较隐蔽的dp)
|
4月前
[NOIP2002]过河卒 标准递归
[NOIP2002]过河卒 标准递归
35 6
|
4月前
【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)
`NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。
39 0
|
算法 C++
【每日算法Day 104】偷电瓶的周某今天放出来了,还不赶紧做这道题防范一下!
【每日算法Day 104】偷电瓶的周某今天放出来了,还不赶紧做这道题防范一下!
|
算法
【递归与递推】洛谷[NOIP2002 普及组] 过河卒
前言 本题来自洛谷P1002. 题目链接:[NOIP2002 普及组] 过河卒 - 洛谷
196 0
|
人工智能 算法 BI
LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前 3 题非常简单,但第 4 题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜总算把第 4 题做出来了,除了新学的 Tarjon 离线算法,这道题还涉及到树上差分、前缀和、DFS、图论等基础知识,几度被折磨得想要放弃。这种感觉,似乎和当年在 LeetCode 上做前 10 题的时候差不多哈哈。
81 0
|
数据安全/隐私保护
【NOI】题目: 潜伏者(9分原因)
【NOI】题目: 潜伏者(9分原因)
243 0
【NOI】题目: 潜伏者(9分原因)
|
存储 数据安全/隐私保护
【每日一题Day83】LC753破解保险箱 | dfs 贪心
题意要求输入一个字符串,能够打开保险柜,密码的长度为n,每位数字小于k,因此题意可以转化为找到一个最短字符串,其包含了n位k进制所有的排列组合
79 0