舞蹈链重复覆盖问题
题目
http://poj.org/problem?id=1084
题意
给出一个用火柴拼成的$n \times n$的网格(一共需要$2n(n+1)$根火柴),按顺序给每个火柴编号,然后去掉其中$k$个火柴。问至少还需要去掉几个火柴,使得网格没有任何正方形。
题目解析
这题可以用舞蹈链的重复覆盖算法解决,也有大佬用迭代深搜AC了。用舞蹈链的话关键在于构建覆盖关系矩阵,可以将正方形作为列,火柴作为行,如果第j个正方形的完整依赖于第i根火柴,则第i行的第j列为1,否则为0。这样题目就转化为选择最少的火柴,使得这些火柴能覆盖所有正方形,最后用使用舞蹈链重复覆盖算法模板就可以了。
比较麻烦的是,遍历所有的正方形需要枚举正方形左上角顶点坐标,然后再枚举正方形的边长,最后还要转一圈,遍历组成该正方形的所有火柴,这循环写的我想哭/(ㄒoㄒ)/~~。然后就是题目在求解前要先删除一些火柴,对于每个要删除的火柴,删的时候关键不是要删除火柴所在的行,而是要删除火柴能覆盖的正方形所对应的列。
代码
1 |
|