状态压缩DP与TSP问题

博客介绍了如何使用状态压缩DP解决TSP问题。通过将集合中元素的选取情况映射到二进制位,将复杂的状态压缩为整数,简化了计算和维护。TSP问题要求在给定邻接矩阵的图中找到从0号节点出发,遍历所有节点一次并返回0号节点的最短路径。定义dp[S][v]为经过点集S后位于点v的最小路径权重,利用状态压缩的递推公式进行求解。博客提供了记忆化搜索和循环求解两种实现方式。
摘要由CSDN通过智能技术生成

状态压缩DP

DP过程中的状态不可能像背包问题一样只有整数,肯定有各种各样稀奇古怪的状态,需要不止一个变量来表示。这种情况下如果需要使用DP 就必须把状态压缩成一个数来表示,并且一个数只能对应于一种状态。

特别地,对于集合我们可以把每一个元素的选取与否对应到一个二进制位里,从而把状态压缩成一个整数,大大方便了计算和维护。

对于不是整数的情况,很多时候很难确定一个合适的递推顺序,因此使用记忆化搜索可以避免这个问题。如下面TSP问题的法一。

TSP问题

一张图上有n个点,给定相应的邻接矩阵,需要求出从0号节点出发,经过且只经过每个顶点一次,最后仍回到0号节点的最小边权。TSP问题可以用状压DP来快速求解。

定义dp[S][v]为已经经过了点集S之后,目前在点v(v已经包含在S中),回到0节点的最小边权。
所以有如下的递推公式


**dp[V[0] = 0
dp[S][v] = min(dp[S∪{u}][u]+d[v][u])(其中u不属于S)**


将S看作一个长度为n的bit流,第几号节点访问过就把S的第几号节点置为1,其他都是0,这样就可以将状态压缩成了一个数字来表示,并且有一一对应性。

采用记忆化搜索的TSP状压DP代码如下

int n;
int d[maxn][maxn];
int dp[1<<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值