传送门:HDU3001
题意:给定一个无向带权图,问在每个点最多走两次的情况下,将图中所有点都遍历一遍的最小花费是多少。
我做的时候这题被放在搜索专题里。。然后没认真看题还以为每个点只能走一次,认为是个简单的TSP问题。。然后就被教育了。。
解法:因为每个点最多走两次,可以由一般的二进制状压联想到用三进制去表示状态,用一个三进制数字的一位数字表示一个点的访问状态,0代表未访问,1代表访问一次,2代表访问两次,不过这里三进制的话就要比二进制麻烦许多了,因为二进制可以用位运算而三进制就必须预处理一下了。然后是DP转移方程:dp[state+three[j]][j] = min(dp[state+three[j]][j], dp[state][i]+map[i][j])
dp[state][j]代表state状态以j点结束的最小花费,three[j]代表三进制第j位的权值。