题目链接
题目分析
题目大意
$n*m$的矩阵,任意相邻(左右/上下)两个点的距离为一,问把所有不为零的点全跑一遍的最短距离。
解析
因为只有最多只有十个点,所以想到了暴力跑的方法。对于一个点DFS,然后标记,然后访问下一级中没有访问的,直到所有都访问了,然后再回溯把标记去掉,相当于跑了10层for循环,很显然这个是会T掉的。所以在这里考虑使用状压DP,如何压缩状态呢?比如当我跑到第二层的5 4 3 2 1
和4 5 3 2 1
,那么3 2 1
有三种情况,以3
结尾,以2
结尾,以1
结尾,所以第一维使用二进制的思想,第二维使用位数来新建数组。这样如果算最终的结果,只需要取二进制位全都取过的,对应的十进制数字就是(2^len-1),以0结尾的数,即dp[2^len-1][0]就是结果。
某神奇的小伙伴竟然使用next_permutation过了,时间复杂度高了一点。
状压DP参考题解: hdu 5067 Harry And Dig Machine(状态压缩dp)
代码
next_permutation
1 |
|
状压DP
1 |
|