[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 搜索最优解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!