题目链接:戳我~
题目描述 Description
某乡有n个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程s是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。
输入描述 Input Description
村庄数n和各村之间的路程(均是整数)
输出描述 Output Description
最短的路程
样例输入 Sample Input
3
0 2 1
1 0 2
2 1 0
样例输出 Sample Output
3
第一次打状压DP,以前只是听说不敢打…… 状压的思想核心还是比较易懂的
核心:
把状态压缩为一个二进制序列,用十进制保存,二进制中每一位都代表着不同的意义,比如说10,它的二进制是1010,可以理解为4号位和2号位的目标达成,1号和3号的目标没有达成。
压缩状态的目的是省空间,因为如果每一种状态开一个多维数组的话太占空间,并且转移也不好写,状压后转移写起来很方便,因为是二进制,主要通过位运算来实现它……
回到题目,看到n <= 15想到状压可以做,状压用在这里就是最外层从1for到2^n,这样就达到了枚举所有状态的目的,(具体实现详见代码),然后核心DP转移方程如下
dp[j][((1 << j-1) | i)