/为了对抗附近恶意国家的威胁,R 国更新了他们的导弹防御系统。
一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。
例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。
给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。
输入格式 输入包含多组测试用例。
对于每个测试用例,第一行包含整数 n,表示来袭导弹数量。
第二行包含 n 个不同的整数,表示每个导弹的高度。
当输入测试用例 n=0 时,表示输入终止,且该用例无需处理。
输出格式 对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。
数据范围 1≤n≤50 输入样例:
代码语言:javascript复制5
3 5 2 4 1
0
输出样例:
代码语言:javascript复制2
样例解释 对于给出样例,最少需要两套防御系统。
一套击落高度为 3,4 的导弹,另一套击落高度为 5,2,1 的导弹。
题解 dfs 最长上升序列,对每个数有两个选择,一个是选择向上一个选择向下
代码语言:javascript复制#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;
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168756.html原文链接:https://javaforall.cn