The upgraded version of the interceptor missile, the interceptor missile only allows the use of the non-rising sub-sequence, we only need to consider two cases
For this question, we can use two sequences of ascending and descending. Then for a number, we have 4 cases, then we can only dfs brute force search to see which case the number is optimal, remember to restore the state
Code
#include<bits/stdc++.h>usingnamespace std;constint N =55;int n;int h[N];int up[N];//不下降序列 (序列种元素的值是递减的)int down[N];//不上升序列 (序列中元素的值是递增的)int res;voiddfs(int u,int su,int sd){
//剪枝(已经大于最优解)if(su + sd >= res)return;if(u == n +1){
//已经全部放入序列中
res = su + sd;return;}//1.将当前数放入上升子序列中int k =0;while(k < su && up[k]>= h[u]) k++;int t = up[k];
up[k]= h[u];if(k < su)dfs(u +1, su, sd);elsedfs(u +1, su +1, sd);
up[k]= t;//2.将当前数放入下降子序列中
k =0;while(k < sd && down[k]<= h[u]) k++;
t = down[k];
down[k]= h[u];if(k < sd)dfs(u +1, su, sd);elsedfs(u +1, su, sd +1);
down[k]= t;}intmain(){
while(cin >> n, n){
for(int i =1; i <= n; i++) cin >> h[i];
res = n;//多组输入,记得更新答案dfs(1,0,0);
cout << res << endl;}return0;}