本文参考: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. HCNP Routing&Switching之代理ARP

    前文我们了解了端口隔离相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16186451.html:今天我们来聊一聊ARP代理相关话题: 端口隔离之破解之 ...

  2. [AcWing 788] 逆序对的数量

    点击查看代码 #include<iostream> using namespace std; typedef long long ll; const int N = 1e5 + 10; i ...

  3. JS中的 && 、|| 、??、?. 运算符

    javascript有不少好用的运算符,合理的使用可以大大提高工作效率,以下简单介绍了4种,具体如下: && 逻辑与运算(&&)是 AND 布尔操作.只有两个操作数都为 ...

  4. SpringCloud微服务实战——搭建企业级开发框架(四十):使用Spring Security OAuth2实现单点登录(SSO)系统

    一.单点登录SSO介绍   目前每家企业或者平台都存在不止一套系统,由于历史原因每套系统采购于不同厂商,所以系统间都是相互独立的,都有自己的用户鉴权认证体系,当用户进行登录系统时,不得不记住每套系统的 ...

  5. 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组

    LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...

  6. Java 统计新客户

    上周做了一个订单数据统计的任务,统计的是订单的新客户数量,本文做一个解题过程的记录和整理. 新客户的定义 新客户指的是选取时间段有订单,时间段之前没有订单. 比如下面的订单数据: 时间段 2月1日之前 ...

  7. 【SSM框架】Spring笔记 --- 事务详解

    1.Spring的事务管理: 事务原本是数据库中的概念,在实际项目的开发中,进行事务的处理一般是在业务逻辑层, 即 Service 层.这样做是为了能够使用事务的特性来管理关联操作的业务. 在 Spr ...

  8. 一些有趣的B+树优化实验

    作为目前数据库引擎的两种主要数据结构,LSM-tree和B+-tree在业界已经有非常广泛的研究.相比B+-tree,LSM-tree牺牲一定的读性能以换取更小的写放大以及更低的存储成本,但这必须建立 ...

  9. 这篇SpringCloud GateWay 详解,你用的到

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 sentinel,即可免费获取源码 背景 在微服务架构中,通常一个系统 ...

  10. Puppeteer学习笔记 (1)- 什么是Puppeteer

    本文链接:https://www.cnblogs.com/hchengmx/p/11006263.html 1. phantomjs介绍 在介绍puppeteer之前必须介绍一下phantomjs,p ...