acwing 187 missile defense system (longest ascending subsequence)

Topic

Insert picture description here

answer

  1. 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
    Insert picture description here
  1. 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>

using namespace std;
const int N = 55;

int n;
int h[N];
int up[N];  //不下降序列 (序列种元素的值是递减的)
int down[N];  //不上升序列 (序列中元素的值是递增的)
int res;

void dfs(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);
    else dfs(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);
    else dfs(u + 1, su, sd + 1);
    down[k] = t;
}

int main() {
    
    

    while (cin >> n, n) {
    
    
        for (int i = 1; i <= n; i++) cin >> h[i];
        res = n;  //多组输入,记得更新答案
        dfs(1, 0, 0);
        cout << res << endl;
    }


    return 0;
}

Guess you like

Origin blog.csdn.net/qq_44791484/article/details/115202746