【发布时间】:2011-06-21 20:43:01
【问题描述】:
NXN 矩阵中的“广义对角线”是 N 个单元的选择,例如:
- 从每一行和每一列中只选择一个单元格
- 每个选定的单元格都包含一个非零值
我正在寻找一种算法来找到 O(n^3) 中的广义对角线。在我看来,以下动态规划算法“足够好”,但我不确定如何分析它的复杂性。
Set<Set<Integer>> failedCache = new HashSet<Set<Integer>>();
List<Integer> find(int[][] matrix, Set<Integer> used, int row) {
int N = matrix.length;
if (failedCache.contains(used))
return null;
if (row == N) return new ArrayList<Integer>();
for (int col = 0; col < N; ++col) {
if (matrix[row][col] == 0)
continue;
if (used.contains(col))
continue;
Set<Integer> newUsed = new HashSet<Integer>(used);
newUsed.add(col);
List<Integer> answer = find(matrix, newUsed, row + 1);
if (answer != null) {
answer.add(col);
return answer;
}
}
failedCache.add(used);
return null;
}
【问题讨论】:
-
您是在寻求帮助分析上述算法,还是在 O(n^3) 中解决问题?我认为我有一个 O(n^3) 算法可以使用完全不同的技术解决这个问题,但如果它在这里偏离主题,我不想发布它。另外,您能否详细说明该算法的来源?我不明白它是如何工作的或它试图做什么,而且如果没有对你是如何做到这一点的高级描述,我不确定我能提供多少帮助。
标签: algorithm matrix dynamic-programming