url:https://www.acwing.com/problem/content/description/189/

至于题解有好多,即枚举所有数,考虑将当前数字放入上升子序列当中还是下降子序列当中。

y总的代码中是

bool dfs(int depth, int u, int su, int sd)
{
    // 如果上升序列个数 + 下降序列个数 > 总个数是上限,则回溯
    if (su + sd > depth) return false;
    if (u == n) return true;

// 枚举放到上升子序列中的情况
    ...
            if (dfs(depth, u + 1, su, sd)) return true;
    ...
        if (dfs(depth, u + 1, su + 1, sd)) return true;

// 枚举放到下降子序列中的情况

...
            if (dfs(depth, u + 1, su, sd)) return true;
    ...
        if (dfs(depth, u + 1, su, sd + 1)) return true;
    }

return false;

int main(){

...

int depth = 0;

while(!dfs(depth,0,su,sd)) depth ++;   #depth即为最后的答案

...

}

这样还是稍微有点难理解的,因为这样操作,在dfs()函数里有许多情况可以早早return,不需要判断下去。

但是我们知道的是这道题的时间复杂度是非常大的,剪枝优化在于得到的答案是否大于之前一直在更新的答案,如果已经大于之前得出的答案,那么这条路就没必要走了。

因此如果把depth写在dfs()函数里,你会发现少了许多return语句,意即许多东西还是要进行判断的,而不能早早返回。当然我个人认为这样子会更好理解。

Python代码如下:

inp = lambda: list(map(int, input().split()))
n, = inp()
def dfs(u, step, up, down):global ans, arr, nif step >= ans:return False    # 回溯条件if u == n:ans = min(ans, step)return Trueflag = True           # 需要创建子序列for i in range(len(up)):if up[i] < arr[u]:# 剪枝操作t = up[i]     # 为复位做准备up[i] = arr[u]flag = False  # 不需要新增子序列dfs(u + 1, step, up, down)up[i] = tbreakif flag:              # 所有的上升子序列都不满足条件up.append(arr[u])dfs(u + 1, step+1, up, down)up.pop()flag = Truefor i in range(len(down)):if down[i] > arr[u]:t = down[i]down[i] = arr[u]flag = Falsedfs(u+1,step,up,down)down[i] = tbreakif flag:down.append(arr[u])dfs(u+1,step+1,up,down)down.pop()return Falsewhile n != 0:ans = float('inf')arr = inp()dfs(0,0,[],[])print(ans)n, = inp()

AcWing 导弹防御系统 Python代码相关推荐

  1. C++---最长上升子序列模型---导弹防御系统(每日一道算法2023.3.5)

    注意事项: 本题的dp:"线性dp-最长上升子序列的长度" 本题的贪心(单调队列):"最长上升子序列模型-拦截导弹" 下面思路只讲如何运用这些东西来解这道题 强 ...

  2. 拦截导弹 导弹防御系统

    拦截导弹 & 导弹防御系统 拦截导弹 导弹防御系统 拦截导弹 题目链接:acwing1010. 拦截导弹 题目描述: 输入输出: 分析: 第一个问题为输出最长递减子序列,由于导弹数在1000以 ...

  3. 导弹防御系统[导弹拦截系统]

    导弹防御系统[dfs] 题目链接 引言(请忽略):今天是小白ACM集训的日子,然后数据结构实在是太难了,真是学不动了,然后就只能无助地去复习以前的题了,记得以前在SDUT程设二里面有一道题叫最少拦截系 ...

  4. 导弹防御系统,如何跟蜻蜓的大脑学习计算?

    来源:大数据文摘 作者:Frances Chance 多雨的夏季,蜻蜓最为常见,这些美丽的生物的飞行速度极快,狩猎能力也极为出色:蜻蜓狩猎的成功率捕获了高达95% ,它们一天可以吃掉数百只蚊子. 这种 ...

  5. 问题 : 导弹防御系统

    题目描述 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  6. CG14导弹防御系统

    [问题描述] 某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的 ...

  7. AcWing LIS相关问题 187 导弹防御系统

    ''' DFS枚举所有可能的元素放到上升序列或者下降序列的情况 '''ans = [0x7fffffff] # 最小序列总数 up = [0] * 60 # 上升序列的尾数数值 down = [0] ...

  8. 垃圾自动分拣系统python代码_Robot recycling 垃圾分拣机器人

    本集内容 Robot recycling 垃圾分拣机器人 学习要点 有关 "technology 科技" 的词汇 边看边答 What percentage of stationar ...

  9. 垃圾自动分拣系统python代码_[HuskyLens]掌控垃圾分拣系统

    360截图20200119220505036_副本.jpg (139.65 KB, 下载次数: 0) 2020-1-19 22:08 上传 2019年7月1日,被称为"史上最严"垃 ...

  10. 电话本系统python代码

    phone_book={} while True: print("您好,欢迎进入通讯录!") print(" 1.添加联系人") print(" 2. ...

最新文章

  1. Ubuntu 想要更新源 报错 “E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)”
  2. UI设计掌握这些技巧,小白也能华丽变身
  3. GridSearchCV 与 RandomizedSearchCV 用法注意随机搜索可以自定义打分 or loss 函数
  4. DBSNMP和SYSMAN用户初始密码及正确的修改方式
  5. 二次元妹子五官画风都能改,周博磊团队用无监督方法控制GAN | CVPR 2021
  6. Russ Miles:被忽略的架构师和混沌工程
  7. git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
  8. Grunt上手指南(转)
  9. One账户多设备同步的数据库设计
  10. linux info命令详解,Linux info 命令简介
  11. ACM算法模板 · 一些常用的算法模板-模板合集(打比赛专用)
  12. vue实现在线客服功能(附完整代码)
  13. 使用CefSharp开发一个12306“安心刷票弹窗通知”工具
  14. 推荐几本图灵最新移动开发图书
  15. windows10的etc路径下没有hosts文件
  16. 修改主分区表给U盘分区
  17. 腾讯云轻量服务器Centos 7.6安装redis 5.0.4教程
  18. 巧学活用html4,巧用教材、活用教材
  19. 调用七牛云简单的上传附件的方法
  20. 驱动新手指南(帮助)

热门文章

  1. 高并发限流-漏桶算法和令牌桶算法
  2. 如果你读不完凯文凯利的《必然》,至少读完这120条书摘
  3. 开发人员的不断流动、让我们更加坚定信念,一定要控制好整个系统的底层架构、核心设计、日常质量检查工作
  4. DataGridViewCellStyle.Format 设置金额格式无作用解决方案
  5. DAY15:尚学堂高琪JAVA(129~131)队列,Enumeration和Hashtable
  6. SDUT 数据库系统概论 关系查询处理和查询优化
  7. 瞎琢磨先生のJava笔记之读取SpringBoot配置文件的几种方式
  8. 程序员毕业去大公司好还是小公司好?
  9. 指数基金日涨跌幅python_用Python验证指数基金定投策略
  10. Vue进阶(六十三):如何使浏览器打开时,默认的文档模式就是标准模式