简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹
本文参考:CPH ,USACO Guide
(大佬请越过,这是初学笔记,不要吐槽内容)
前置知识:位运算基础,动态规划基础
介绍
状态是元素的子集的动态规划算法,可以用位运算来高效的优化。
那么第一道题就应声而来:
我觉得这道题会花费很长时间,但是这题不算难,首先要自己尝试。
题目意思是给定一个很小的图,从\(1\)号点到\(n\)号点,每个点恰好走一次有几种方案?
看过这道题,你是否想到了旅行商问题?没错,这是一个没有保证正确的多项式时间复杂度的算法的问题。好吧,至少方向是有了。\(\mathcal O(n!)\)枚举,这是一个很贴合\(n\)范围的算法。但是显然他还需要再快一点。
不去思考如何优化,一般的思路是考虑在枚举中我们浪费了哪些时间。如果这个算法还可以做最优,那么一定是有哪一些重复计算。因为动态规划的本质就是利用记忆化来减少重复计算。在不考虑动态规划的情况下,大多数暴力算法也可以先考虑哪些计算重复。
那么在这个哈密顿航班的问题里边,我们发现如果固定了一些点集和一个结尾,就能根据它算出所有点。
如果用动态规划的思路来思考的话,如果我们已经求得了点集S从1走到i的答案,那么其他答案就可以由这个状态推出。因为在这个问题里面每个状态只需要知道走到哪里和还有哪些点需要走。这道题就是这么做的。
这样我们把复杂度优化到\(\mathcal O(2^n n)\)级别。
练习
CF1316E Team Building
USACO Gold Uddered but not Herd
这两道题都是推荐的简单但比较创新的状压DP。
深入
在一张比较小的图中选择最大的点集使得选出来的点之间任意两点在原图没有边。图的点的数量小于等于40。
首先可以把原题转化成另一个问题,建立原图的补图,就是说点之间有边变无边,无变边有边。根据题意,我们可以把题目转化成求补图的最大团问题(MCP, Maximum Clique Problem)。团可以理解成为一个是完全图的子图。
其实这个DP不是很好考虑。而且感觉如果已经求出了一个子图的最大团,这个最大团未必包含在子图增加一个点后的新图的最大团里面,因为一个子图的最大团可能有多个。而且只存储最大团的数量也不是一个好办法,因为这样没有办法转移方程。
以上这种考虑完全是基于,每次DP在原来子图基础上扩展一个点这样的思路。那么可以切换一下思路。那么考虑扩展之后的子图最大团,这个最大团去掉一个点会如何。我们让动态规划数组存储子图中最大团的点集,也就是说动态规划数组中也是一个状压。
那么再来细细扩充一下刚才的思路。假设当前要求子图最大团的子图的点集为S。单纯的用 \(F[S]\) 表示子图中的一种最大团解答方案。考虑S中的一个点k,如果这个点在最大团中,那么 \(F[S]=F[S中与k相连的点集] \bigcup {k}\),否则即为 \(F[S/{k}]\) ,取两个里面边数更多的一种方案。因为状态方程设置的是任意一种最大团方案,所以不用担心。
但是这样复杂度为 \(\mathcal O(2^n)\) 或\(\mathcal O(2^n n)\),还需要进一步优化。
简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹的更多相关文章
- 简单状压dp的思考 - 最大独立集问题和最大团问题 - 贰
接着上文 题目链接:最大独立集问题 上次说到,一种用状压DP解决任意无向图最大团问题(MCP)的方程是: 注:此处popcountmax代表按照二进制位下1的个数作为关键字比较,即选择二进制位下1的个 ...
- POJ 3254 简单状压DP
没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...
- poj2411 Mondriaan's Dream[简单状压dp]
$11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...
- Walk Through Squares HDU - 4758 AC自动机+简单状压DP
题意:给你两个串,求用m个R,n个D能组成多少个包含这两个串 题解:先构造一个AC自动机记录每个状态包含两个串的状态, 状态很容易定义 dp[i][j][k][status]表示在AC自动机K这个节点 ...
- [Usaco2008 Nov]mixup2 混乱的奶牛 简单状压DP
1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 685 Solved: 383[S ...
- 2018.09.22 牧场的安排(状压dp)
描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...
- 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集
maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...
- ZOJ3802 Easy 2048 Again (状压DP)
ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
随机推荐
- [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算
[源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 目录 [源码解析] TensorFlow 分布式之 MirroredStrategy 分发计算 0x1. 运行 ...
- .NET桌面程序应用WebView2组件集成网页开发4 WebView2的线程模型
系列目录 [已更新最新开发文章,点击查看详细] WebView2控件基于组件对象模型(COM),必须在单线程单元(STA)线程上运行. 线程安全 WebView2必须在使用消息泵的UI线程上创 ...
- [题解] 春荔(cut) | 贪心
题目大意 有一个长度为 \(n\) 的非负整数序列 \(a_i\),每次可以选择一段区间减去 \(1\),要求选择的区间长度 \(\in[l,r]\),问最少多少次把每个位置减成 \(0\). 不保证 ...
- 用浏览器快速开启Docker的体验之旅
互联网科技发展创造了很多奇迹,比如我今天要提到的 docker 技术就是其一.我很早就关注它(在2015年写过这方面的博客),那会儿还只是一个开源项目,现在已经是一个行业事实标准了,它推动了云原生的变 ...
- NLP教程(7) - 问答系统
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www.showmeai.tech/article-det ...
- 力扣算法:LC 704-二分查找,LC 27-移除元素--js
LC 704-二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 ...
- 安装Speedtest到CentOS(YUM)
Speedtest是一个由Python语言编写的一个网络测速脚本,提供多个外网的测试站点,我们可以使用它测试网络的IO速度. 如果由于网络问题导致无法下载软件包,则可以通过安装模块到Python的方式 ...
- 一文学完Linux常用命令
一.Linux 终端命令格式 1.终端命令格式 完整版参考链接:Linux常用命令完整版 command [-options] [parameter] 说明: command : 命令名,相应功能的英 ...
- VUE3 之 render 函数的使用 - 这个系列的教程通俗易懂,适合新手
1. 概述 老话说的好:不用想的太多.太远,做好当天的事,知道明天要做什么就可以了. 言归正传,今天我们来聊聊 VUE 中 render 函数的使用. 2. render 函数 2.1 一个简单的例子 ...
- 【原创】项目一GoldenEye
实战流程 1,通过nmap查找本段IP中存活的机器 ┌──(root㉿whoami)-[/home/whoami/Desktop] └─# nmap -sP 192.168.186.0/24 排查网关 ...