| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 524. 愤怒的小鸟(重复覆盖,集合类状压dp) -> 正文阅读 |
|
[数据结构与算法]524. 愤怒的小鸟(重复覆盖,集合类状压dp) |
关键:枚举所有的情况会超时,只需要枚举必要的中间状态,使得结果正确即可 步骤:
分析: 由于抛物线一定通过原点(0,0),任意两个小猪的坐标都可以组成一个抛物线
同时,由于任意两个点之间是构成抛物线的,并且一条抛物线上可能有多个小猪
那么,有两个点可以推出抛物线的公式为 ? ? ? ? ? ? ? ? ? ??
暴力搜索: 先处理出所有的抛物线,记录当前状态state
状态压缩: 由于点的范围很小,可以先预处理出所有的点,然后进行状态压缩dp 状态表示:所有当前已覆盖点的状态为i的所有集合 状态计算: x表示当前没有覆盖的某个点,k表示包括x在内的所有点,运用正拓扑排序的方式进行递推
优化版本由于我们发现,对于某一个抛物线,他之前用过的抛物线,和后面用的抛物线没有任何关系 那么我们可以抛弃一些中间状态,不去计算他,只要确保最终状态dp[(1<<n)-1]的正确 那么我们不需要记录 0~1<<n -1 中的所有状态,只需要确保 0~n-1 所有的点,都能够使用到包含他本身的,最优的抛物线。 那么我们可以从0~1<<n-1 递推 ,然后每次找到第一个未覆盖的点(任意一个都可以),然后根据这个点枚举所有他所在的抛物线,看看哪个对于当前状态最佳进行递推 对于任意一个点,早晚都会覆盖他,只要确保递推中一定能够覆盖所有点就可以。
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 16:38:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |