大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
原题连接
/为了对抗附近恶意国家的威胁,R 国更新了他们的导弹防御系统。
一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。
例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。
给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。
输入格式
输入包含多组测试用例。
对于每个测试用例,第一行包含整数 n,表示来袭导弹数量。
第二行包含 n 个不同的整数,表示每个导弹的高度。
当输入测试用例 n=0 时,表示输入终止,且该用例无需处理。
输出格式
对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。
数据范围
1≤n≤50
输入样例:
5
3 5 2 4 1
0
输出样例:
2
样例解释
对于给出样例,最少需要两套防御系统。
一套击落高度为 3,4 的导弹,另一套击落高度为 5,2,1 的导弹。
题解
dfs+最长上升序列,对每个数有两个选择,一个是选择向上一个选择向下
#include<bits/stdc++.h>
#include<cmath>
#define x first
#define y second
#define send string::npos
#define lowbit(x) (x&(-x))
#define left(x) x<<1
#define right(x) x<<1|1
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
typedef struct Node * pnode;
const int N = 1e3 + 10;
const int M = 5e5 + 10;
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int Mod = 4e8;
int up[N],down[N],a[N];
int cnt_up,cnt_down;
int n,res = INF;
void dfs(int u){
if(cnt_down + cnt_up >= res)return;
if(u == n){
res = cnt_up + cnt_down;
return;
}
int k = 0,Max;
while(k < cnt_up && up[k] <= a[u])k ++;
if(k == cnt_up){
up[cnt_up ++] = a[u];
dfs(u + 1);
cnt_up --;
}
else {
int t = up[k];
up[k] = a[u];
dfs(u + 1);
up[k] = t;
}
k = 0;
while(k < cnt_down && down[k] >= a[u])k ++;
if(k == cnt_down){
down[cnt_down ++] = a[u];
dfs(u + 1);
cnt_down --;
}else{
int t = down[k];
down[k] = a[u];
dfs(u + 1);
down[k] = t;
}
}
int main(){
while(cin>>n && n){
memset(up,0,sizeof up);
memset(down,0,sizeof down);
cnt_up = cnt_down = 0;
res = INF;
for(int i = 0;i < n;i ++)cin>>a[i];
dfs(0);
cout<<res<<endl;
}
return 0;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/168756.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...