本文参考: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)\),还需要进一步优化。

注释:这是我本人在USACO Guide上的题解

简单状压dp的思考 - 最大独立集问题和最大团问题 - 壹的更多相关文章

  1. 简单状压dp的思考 - 最大独立集问题和最大团问题 - 贰

    接着上文 题目链接:最大独立集问题 上次说到,一种用状压DP解决任意无向图最大团问题(MCP)的方程是: 注:此处popcountmax代表按照二进制位下1的个数作为关键字比较,即选择二进制位下1的个 ...

  2. POJ 3254 简单状压DP

    没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...

  3. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  4. Walk Through Squares HDU - 4758 AC自动机+简单状压DP

    题意:给你两个串,求用m个R,n个D能组成多少个包含这两个串 题解:先构造一个AC自动机记录每个状态包含两个串的状态, 状态很容易定义 dp[i][j][k][status]表示在AC自动机K这个节点 ...

  5. [Usaco2008 Nov]mixup2 混乱的奶牛 简单状压DP

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 685  Solved: 383[S ...

  6. 2018.09.22 牧场的安排(状压dp)

    描述 农民 John 购买了一处肥沃的矩形牧场,分成M*N(1 <= M <= 12; 1 <= N <= 12)个 格子.他想在那里的一些格子中种植美味的玉米.遗憾的是,有些 ...

  7. 2019牛客多校第五场 F maximum clique 1 状压dp+最大独立集

    maximum clique 1 题意 给出一个集合s,求每个子集的最大独立集的权值和(权值是独立集的点个数) 分析 n比较小,一股浓浓的暴力枚举每一个子集的感觉,但是暴力枚举模拟肯定会T,那么想一想 ...

  8. ZOJ3802 Easy 2048 Again (状压DP)

    ZOJ Monthly, August 2014 E题 ZOJ月赛 2014年8月 E题 http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  9. POJ 1185 炮兵阵地(状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26426   Accepted: 10185 Descriptio ...

随机推荐

  1. jdk1.8中hashmap的扩容resize

    当hashmap第一次插入元素.元素个数达到容量阀值threshold时,都会扩容resize(),源码: (假设hashmap扩容前的node数组为旧横向node数组,扩容后的node数组为新横向n ...

  2. 网络协议之:Domain name service DNS详解

    目录 简介 DNS的功能 DNS的组成 域名空间Domain name space Name servers DNS的工作流程 DNS资源记录 DNS消息的结构 总结 简介 现在是互联网的世界,大家从 ...

  3. Git 日志提交规范

    Commit messages的基本语法 当前业界应用的比较广泛的是 Angular Git Commit Guidelines 具体格式为: <type>: <subject> ...

  4. Java学习笔记-基础语法Ⅶ-集合

    集合 集合类特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 这里需要回顾一下,因为数组和字符串一旦创建,就不可改变,需要区分一下 import java.util.ArrayLi ...

  5. 项目完成小结 - Django3.x版本 - 开发部署小结 (2)

    前言 好久没更新博客了,最近依然是在做之前博客说的这个项目:项目完成 - 基于Django3.x版本 - 开发部署小结 这项目因为前期工作出了问题,需求没确定好,导致了现在要做很多麻烦的工作,搞得大家 ...

  6. python入门基础知识一(基于孙兴华python自动化)

    print('aaa')等价于print("aaa") 英文单引号和双引号在字符串的输出上并无区别,但如果要打印这么一段话:I'm interested in Python. 就要 ...

  7. 169. Majority Element - LeetCode

    Question 169. Majority Element Solution 思路:构造一个map存储每个数字出现的次数,然后遍历map返回出现次数大于数组一半的数字. 还有一种思路是:对这个数组排 ...

  8. SpringBoot从Eclipse添加的Tomcat容器中启动

    SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ...

  9. Linux内网渗透

    Linux虽然没有域环境,但是当我们拿到一台Linux 系统权限,难道只进行一下提权,捕获一下敏感信息就结束了吗?显然不只是这样的.本片文章将从拿到一个Linux shell开始,介绍Linux内网渗 ...

  10. pycharm解释器的配置等

    转自:http://www.360doc.com/content/18/0913/14/11881101_786350505.shtml 为什么安装python后,还需要pycharm配置环境 我们实 ...