博客
关于我
6.22 集训--DP复习一
阅读量:439 次
发布时间:2019-03-06

本文共 1150 字,大约阅读时间需要 3 分钟。

技术分析与解决方案

A. 拦截导弹简单版

题目描述

某国开发了一种导弹拦截系统,虽然第一发炮弹能到达任意高度,但之后每一发炮弹的高度不能超过前一发。敌方导弹来袭,系统需要尽可能多地拦截导弹,同时计算最少需要配备多少套系统才能拦截所有导弹。

解决思路

使用最长递增子序列(LIS)算法。我们可以正着和倒着各运行一次LIS,得到的结果即为最多能拦截的导弹数和系统数。

代码解析

代码中定义了两个数组 f1 和 f2,分别用于存储正向和逆向的LIS长度。通过遍历每个导弹的高度,更新LIS长度并记录最大值,最后输出结果。

B. 挖地雷

题目描述

N个地窖之间有单向路径,需要找到一个挖地雷的顺序,使得能挖到最多地雷。

解决思路

使用动态规划和拓扑排序。定义 f[j] 为挖到编号为 j 的地窖的最大地雷数。通过拓扑排序,确保每个地窖的前驱已经处理,更新 f 数组。最后按拓扑顺序输出结果。

C. 飞翔

题目描述

在迷宫中,鹰需要从起点到终点找到最短路径。迷宫中的边分为普通边和特殊边,特殊边的处理需要优化。

解决思路

特殊边按横坐标排序后,使用LIS算法计算最长递增子序列的长度。普通边的数量乘以矩阵的宽度即为总路径长度。

代码解析

代码中定义了 ans 变量,用于存储LIS的最大长度。通过排序特殊边,计算LIS长度,并结合普通边数计算总路径长度,最后输出结果。

D. 麻烦的聚餐

题目描述

奶牛排队,卡片上的编号需要调整,使其成为一个合法的不下降序列。最少需要改动多少次卡片编号?

解决思路

使用LIS优化来计算最小改动次数。将卡片编号视为一个序列,计算其最长递增子序列的长度,然后用总长度减去LIS长度即为最少改动次数。

代码解析

代码中定义了 a 数组,存储卡片编号。通过LIS算法计算最大长度,并输出总长度减去最大长度的结果。

E. 奶牛渡河

题目描述

FJ需要将N头奶牛渡过河,每次渡河时间根据船上奶牛数目增加。最少需要多少时间才能完成任务?

解决思路

使用动态规划,计算每次运输的时间,并记录最优策略。最后输出总时间,减去最后一次渡河不需要返回的时间。

代码解析

代码中定义了 sum 和 f 数组,用于存储每次运输的时间和最优时间。通过遍历奶牛数量,计算每次运输的时间,并更新最优时间。

F. 机器分配

题目描述

总公司有M台设备,分给N个分公司,每台设备分配给任意公司,总台数不超过M。如何分配才能使盈利最大?

解决思路

使用动态规划,逐公司处理,记录每台设备的最优分配方式。最终输出最大盈利值和设备分配方案。

代码解析

代码中定义了 a 数组,存储每个公司每台设备的盈利值。通过动态规划,逐公司处理,记录最优分配方式,最后输出结果。

以上是各个问题的分析与解决方案,希望能为您提供帮助。

转载地址:http://smpyz.baihongyu.com/

你可能感兴趣的文章
python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
查看>>
python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
查看>>
python 利用pyttsx3文字转语音
查看>>
python 利用已有Ner模型进行数据清洗合并
查看>>
python 到大数据开发工程师_如何成为一个大数据开发工程师?
查看>>
python 加密解密(base64, AES)
查看>>
Python 和Java 哪个更适合做自动化测试?
查看>>
python 图片转ico
查看>>
python 图片转文字、语音转文字、文字转语音保存音频并朗读
查看>>
python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
查看>>
Python 在并行进程之间共享字典
查看>>
Python 垃圾收集器文档
查看>>
python 基于 wordcloud + jieba + matplotlib 生成词云
查看>>
python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
查看>>
Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
查看>>
python 基础第七篇
查看>>
Python编程:Tkinter图形界面设计(1)
查看>>
Python 基础语法:None
查看>>
Python 基础语法:基本数据类型(一)
查看>>
python编程读取写入excel_Python读取txt内容写入xls格式excel中的方法
查看>>