考虑一个 n * n 的二进制矩阵。每个单元格最多有4个邻居(如果存在)。 如果它们是邻居并且它们的值不相等,则我们称这个矩阵的两个单元格不兼容。 我们为每一对不兼容的单元格支付 $b。此外,我们可以更改该单元格的值并支付 $a。
问题是找到此矩阵的最小成本。
我已经使用回溯法,并找出了一个O(2 ^ (n * n))的算法。 有人能帮我找到一个更有效的算法吗?
问题是找到此矩阵的最小成本。
我已经使用回溯法,并找出了一个O(2 ^ (n * n))的算法。 有人能帮我找到一个更有效的算法吗?
我建议您重新构思回溯算法,以使用动态规划来修剪回溯树。这是我提出的设计逻辑:
在决定是否更改单元格时,先前分配的单元格如何并不重要,只有累积成本才重要,因此您可以为每个单元格和每个可能的累积成本跟踪已找到的最小结果。这样,每当您再次找到相同的配置时,您将保存答案。
因此,您的dp矩阵应该类似于:
dp[top_bound][n][n];
在进行回溯之前,您应该执行以下操作:
if(dp[acc_cost][this_i][this_j] != -1)
return dp[acc_cost][this_i][this_j];
// Perform your calculations
// ...
dp[acc_cost][this_i][this_j] = result;
return result;
在这里,我假设-1
是结果中的无效值,如果不是,则选择任何无效值并将矩阵初始化为它。由于该矩阵的大小为n * n * top_bound,因此正确实现的DP应该在O(n * n * top_bound)内解决问题。