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

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

技术分析与解决方案

A. 拦截导弹简单版

题目描述

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

解决思路

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

代码解析

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

B. 挖地雷

题目描述

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

解决思路

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

C. 飞翔

题目描述

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

解决思路

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

代码解析

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

D. 麻烦的聚餐

题目描述

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

解决思路

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

代码解析

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

E. 奶牛渡河

题目描述

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

解决思路

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

代码解析

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

F. 机器分配

题目描述

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

解决思路

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

代码解析

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

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

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

你可能感兴趣的文章
Pandas 中的多索引旋转
查看>>
Pandas 中的日期范围
查看>>
pandas 中的时间序列箱线图
查看>>
Pandas 使用指南
查看>>
Pandas 对数据框的布尔比较
查看>>
pandas 时间序列重新采样结束给定的一天
查看>>
pandas 根据不是常量的第三列的值将值从一列复制到另一列
查看>>
pandas 根据值从多列中的一列查找
查看>>
Pandas 根据布尔条件选择行和列
查看>>
pandas 读取excel数据,以字典形式输出
查看>>
Pandas 读取具有浮点值的 csv 文件会导致奇怪的舍入和小数位数
查看>>
pandas 适用,但仅适用于满足条件的行
查看>>
pandas 重新采样到每月的特定工作日
查看>>
pandas :检测一个DF和另一个DF之间缺失的列
查看>>
Pandas-从具有嵌套列表列表的现有列创建动态列时出错
查看>>
Pandas-通过对列和索引的值求和来合并两个数据框
查看>>
pandas.read_csv()的详解-ChatGPT4o作答
查看>>
PANDAS.READ_EXCEL()输出‘;溢出错误:日期值超出范围‘;而不存在日期列
查看>>
Pandas、Matplotlib、Pyecharts数据分析实践
查看>>
Pandas中文官档~基础用法2
查看>>