Acwing-----187. 导弹防御系统

算法

在1010.拦截导弹:https://www.acwing.com/problem/content/1012/  的基础上加上dfs

代码

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 55;

int n, ans;
int q[N], up[N], down[N];

void dfs(int u, int su, int sd) {
    // su 上升子序列个数
    // sd 下降子序列个数 
    if (su + sd >= ans) return;
    if (u == n) {
        ans = su + sd;
        return;
    }
    // 1.当前数放入上升子序列
    int k = 0;
    while (k < su && up[k] >= q[u]) k++;
    int t = up[k];
    up[k] = q[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] <= q[u]) k++;
    t = down[k];
    down[k] = q[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= 0; i < n; ++i) cin >> q[i];
        
        ans = n;
        dfs(0, 0, 0);
        cout << ans << endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/clown9804/p/12600976.html