状压DP
顾名思义,状压dp的终点就在于状态。在解决问题的时候,状态是考虑的关键。下一步的问题转移中状态是必要的考虑因素。
【位运算 基础】
【例题*】
经典问题:给出一张n个点的带权有向图,求一条路径,使得这条如今经过每个点恰好一次,并且路径上的边权和最小。
解析:
为什么这个问题会是状压DP呢,我们从题目分析。首先,题目的约束条件是:经过每个点恰好一次。那么这个也就意味着,每个点带来的状态必须是单一的,可被读取的,不能用其他变量将其概之。我们每次状态转移的时候,都需要知道每个点当前的的状态。
这题的dp式子很水
dp[i][s]目前走到节点i,节点经过状态S
dp[i][s]+w[i][j]=dp[j][s∪j]
【例题0】
有一个N*M的网格图,已知若干格子不能选,不能有相邻的格子被选。在不限制所有格子总数的前提下,求方案数。
解析:
其实这题的和例题*的状态很像,都是要计算和考虑一个图里面节点的选/不选的状态情况。只不过这道题的判断更加复杂。
1.我们要枚举的状态是什么?
刚开始我认为,每次要枚举的状态是整个网格图的状态,但事实上,整个网格图的状态太大,而且每次的状态转移也不需要全部读取。
事实上,我们每次需要读取的状态,只是当前我们判断的节点的周围的节点状态就好了。
2.我们要以什么为每次的转移
如果枚举每一个节点的话,显然不现实,而且太慢,记录状态也比较繁琐和难以读取
所以我们每次转移行/列
3.每次怎么转移
如果是以行为单位的话,相当于我们每次除了考虑被选节点左右是否也有被选节点,还有就是上一行的当前位置是否有节点
为什么不考虑下一行呢,因为下一行考虑上一行的时候就会考虑到这一行的
冲突可以之间用S1&S2表示
我们在DP之前可以预处理出每一行的可选的总方案数,DP的时候直接用上
复杂度 n*3772
【例题1】
给出一张N个 点M条边的无向图。每个点有一个颜色。一条路径是合法的当且仅当它按顺序经过的节点的颜色序列写下来同种颜色出现的位置是连续的。计算合法的经过每个节 点恰好一次的路径条数。
n<=100 color<=10 cnt_color<=10
解析:
分析题目
1.同种颜色位置连续