【发布时间】:2011-09-06 01:24:34
【问题描述】:
给定一个 0-1 方阵,我们可以通过多少种方式选择 1,使得每一行和每一列都恰好包含一个 1?
我已经为这个问题实现了以下回溯代码:
int countways(int A[][], int& n, int row, vector<bool> columnselected ) {
if(row == n)
return 1;
int result = 0;
for( j = 0; j < n ; ++j) {
if(A[row][j]) {
if(!columnselected[j]) {
columnselected[j] = true;
result+ = countways(A, n, row+1, columnselected);
columnselected[j] = false;
}
}
}
return result;
}
这绝对不是解决这个问题的最好方法。我无法通过使用递归的记忆版本来增强解决方案,因为每次调用递归的 columnselected 和 row 对于每个子问题都是唯一的。
请提出一个更好的方法来解决这个问题,更像是一个动态编程解决方案,比这个明显的解决方案更有效。
【问题讨论】:
-
@belisarius 现在我看到它可以完成,但恐怕它仍然不是多项式时间,计算 Rook 多项式将需要计算匹配多项式,这是一个#P-Complete 问题。我们可以做些什么来在多项式时间内完成这项工作吗??
-
哦,我明白了,我的错。我删除了以前的 cmets,因为它们具有误导性。
标签: algorithm matrix dynamic-programming