参考博客:https://blog.csdn.net/accry/article/details/6607703
状态压缩主要指的是用位运算代替枚举压缩DP的时间,如果某一个状态和之前状态的顺序没有关系,那么就可以将之前的选或者不选压缩到一个二进制数中。在选择第i个时枚举之前的所有可能的i-1状态,但是这i-1状态是不记录顺序的,只在i-1到i时考虑顺序,这样的话往往能够节约很多时间。
大致题意是从原点出发送披萨到n个点{pi},给了pi直接到pj的时间,求送一遍再回到原点的最短时间(每个点可以走无数次)。但是有可能绕一段路比直接去时间更短,这就需要预处理一下找到pi到pj的最短时间,因为点的个数比较少所以O(n^3)也不会超时。具体的代码没有写过,看了一下题目和题解,觉得这题还是挺经典的。想法很简单,每一个子状态就是现在所在的点和之前到过的点,用一个二进制数来表示,然后枚举在这个点之前最后到的是哪一个点,求出最短的时间。然后一些位运算的小技巧也是需要注意的:dp[S][i] =min(dp[S^(1<<(i-1))][j] + dis[j][i],dp[S][i]);用异或来表示除了i没有走过其他都和S相同的