本文参考: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. XCTF练习题---MISC---a_good_idea

    XCTF练习题---MISC---a_good_idea flag:NCTF{m1sc_1s_very_funny!!!} 解题步骤: 1.观察题目,下载附件 2.到手以后发现是一张图片,尝试修改文件 ...

  2. Nessus简单介绍与安装

    1.Nessus简单介绍与安装 1.Nessus简介 Nessus号称是世界上最流行的漏洞扫描程序,全世界有超过75000个组织在使用它.该工具提供完整的电脑漏洞扫描服务,并随时更新其漏洞数据库.Ne ...

  3. Flatbuffers学习

    flatbuffers简介 FlatBuffers 是一个(二进制 buffer)序列化开源库,由 Google 开源现在它支持C++, C#, C, Go, Java, Kotlin, JavaSc ...

  4. python使用虚拟环境venv

    venv模块支持使用自己的站点目录创建轻量级"虚拟环境",可选择与系统站点目录隔离.每个虚拟环境都有自己的Python二进制文件(与用于创建此环境的二进制文件的版本相匹配),并且可 ...

  5. ES6片段

    那些可能会忘记或不知所以然的点: 1. 2. 3. 4. 5. 6. /* 函数调用会在内存形成一个"调用记录",又称调用帧,保存调用位置和内存变量等信息. 如果在函数 A 的内部 ...

  6. pycham的安装、优化、使用

    一.下载与安装 下载地址:https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Releases 注册:参考地址:http://i ...

  7. 基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理

    在前面介绍的SqlSugar的相关查询处理操作中,我们主要以单表的方式生成相关的实体类,并在查询的时候,对单表的字段进行条件的对比处理,从而返回对应的数据记录.本篇随笔介绍在一些外键或者中间表的处理中 ...

  8. 渗透:wesside-ng

    WEP自动破解工具wesside-ng wesside-ng是aircrack-ng套件提供的一个概念验证工具.该工具可以自动扫描无线网络,发现WEP加密的AP.然后,尝试关联该AP.关联成功后,它会 ...

  9. unity---脚本创建文本

    脚本创建文本 新建文件夹 Resources 方便引用字体 在文件Resources中新建Fonts,并且下载一个ttf字体 没有字体,文本内容无法显示 脚本如下 public GameObject ...

  10. drools中的条件 when

    目录 1.介绍 2.语法结构 3.模式例子 3.1 单个对象匹配 3.2 匹配任何对象 3.3 带条件匹配 3.3.1 注意事项 3.4 嵌套属性的匹配 3.4.1 访问单个嵌套属性 3.4.2 访问 ...