AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 187. 导弹防御系统    原题链接    中等

作者: 作者的头像   xApathy ,  2025-06-07 09:22:51 · 北京 ,  所有人可见 ,  阅读 2


0


思路

DFS,迭代加深,剪枝,贪心,模仿y总的思路,可以利用贪心剪枝,用depth表示迭代,如果迭代完成,当前的depth是可以接受的,就是最优的,其他的请见y总题解。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int a[N],up[N],dw[N],depth;
int n;
bool dfs(int depth,int u,int d,int t)
{
    if(depth<u+d)return false;
    if(t == n+1) return true;
    bool flag = false;
    for(int i=1;i<=u;i++)
    {
        if(up[i]<a[t])
        {
            int x = up[i];
            up[i] = a[t];
          if(dfs(depth,u,d,t+1))return true;
            up[i] = x;
            flag = true;
            break;
        }
    }
    if(!flag)
    {
        up[u+1]  = a[t];
     if(dfs(depth,u+1,d,t+1))return true;
    }
    flag = false;
    for(int i=1;i<=d;i++)
    {
        if(dw[i]>a[t])
        {
            int x = dw[i];
            dw[i] = a[t];
          if(dfs(depth,u,d,t+1))return true;
            dw[i] = x;
            flag = true;
            break;
        }
    }
    if(!flag)
    {
        dw[d+1]  = a[t];
     if(dfs(depth,u,d+1,t+1))return true;
    }
    return false;
}

int main()
{
   while(cin>>n){
       if(n==0)break;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    depth = 0;
    while(!dfs(depth,0,0,1))depth++;
    cout<<depth<<"\n";
   }
}

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息