http://acm.hdu.edu.cn/showproblem.php?pid=3920
题意:
你在一个位置用激光枪灭敌人,给你初始位置,下面是2*n个敌人的位置,你一枪能杀两个,可以杀死任意两个人,激光束的路径是消耗的能量,求最小能量,保证一次只消灭两个敌人,你的位置不变。
解:
果然给人的感觉和hdu 4385是一样一样的,不过那个多了一条回来的边,连点的个数都一样。。。。。。
这是我做的第二道状压的题。第一道我快忘得差不多了,只记得当时我wa了很多遍,然后用结构体最后过的,因为要保持所用时间和状态的统一性。
我想啊,这怎么有最优子问题呢。后来看了解题报告,确实有个先与后的关系,先杀后杀的关系,先死和后死的关系。还把状态的先后顺序给定了一定。比如1,2配,5,6配,你可以人为规定1,2配了之后5,6再配,得到最后的结果都是1,2和5,6都配好对了,当前这个状态不受前面取点的顺序影响。这是个剪枝(我认为),也就是黑书说的第一个dp动机,减少重复找过的状态(还有减少dfs,就是减少开栈的花费)。看来这题关键就是卡时间,卡剪枝的。
对于网上说的先走距离me最近的,再走次近的,我表示怀疑。那要是有3个最近和1个次近呢,你走哪个呢?比如:
走1->2,4->3, 还不如1->3,2->4呢。
收回之间的怀疑。不知道为什么,出了个样例,居然是对的。不甚理解。明天再来搞吧!
DP[state]表示为state状态时的最小距离和
状态转移方程: DP[state]=min(DP[state],DP[state^(1<<i)^(1<<j)]+dis(p[i],p[j])+dis(me,p[i]))