[AcWing 187] 导弹防御系统


点击查看代码
#include<iostream>
using namespace std;
const int N = 60;
int n, res;
int a[N], up[N], down[N];
void dfs(int u, int su, int sd)
{
if (su + sd >= res) return ;
else if (u == n + 1) {
res = min(res, su + sd);
return ;
}
int k = 0;
while (k < su && up[k] >= a[u]) k ++;
if (k < su) {
int t = up[k];
up[k] = a[u];
dfs(u + 1, su, sd);
up[k] = t;
}
else {
up[k] = a[u];
dfs(u + 1, su + 1, sd);
}
k = 0;
while (k < sd && down[k] <= a[u]) k ++;
if (k < sd) {
int t = down[k];
down[k] = a[u];
dfs(u + 1, su, sd);
down[k] = t;
}
else {
down[k] = a[u];
dfs(u + 1, su, sd + 1);
}
}
int main()
{
while (cin >> n, n) {
for (int i = 1; i <= n; i ++) cin >> a[i];
res = n;
dfs(1, 0, 0);
cout << res << endl;
}
return 0;
}
- DFS, 迭代加深, 剪枝
对于每个点,枚举在上升子序列和下降子序列两种情况,通过 dfs 搜索最优解

浙公网安备 33010602011771号