博客
关于我
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/

你可能感兴趣的文章
Oracle 11g中的snapshot standby特性
查看>>
Oracle 11g关闭用户连接审计
查看>>
Oracle 11g忘记sys、system、scott密码该这样修改!
查看>>
Oracle 11g数据库安装和卸载教程
查看>>
Oracle 11g数据库成功安装创建详细步骤
查看>>
Oracle 11g超详细安装步骤
查看>>
Oracle 12c中的MGMTDB
查看>>
Oracle 12c安装报错Installation failed to access the temporary location(无法访问临时位置)...
查看>>
Oracle 9i数据库管理教程
查看>>
ORACLE Active dataguard 一个latch: row cache objects BUG
查看>>
oracle avg、count、max、min、sum、having、any、all、nvl的用法
查看>>
Oracle BEQ方式连接配置
查看>>
oracle Blob保存方式,oracle 存储过程操作blob
查看>>
Oracle BMW Racing sailing vessel帆船图
查看>>
ORACLE Bug 4431215 引发的血案—原因分析篇
查看>>
Oracle cmd乱码
查看>>
Oracle Corp甲骨文公司推出Oracle NoSQL数据库2.0版
查看>>
Oracle DBA课程系列笔记(20)
查看>>
oracle dblink 创建使用 垮库转移数据
查看>>
oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
查看>>