【发布时间】:2017-12-06 13:43:08
【问题描述】:
考虑一个由非负整数组成的 3 x 3 方格。对于每一行i,整数之和设置为r_i。类似地,对于每一列j,该列中的整数总和设置为c_j。因此,问题的一个实例由6 非负整数描述。
是否有一种有效的算法来计算有多少不同 将整数分配给网格有给定行和列 总和约束?
显然,可以枚举所有可能的非负整数矩阵,其值不超过sum r_i,并检查每个矩阵的约束,但这会非常慢。
示例
假设行约束是1 2 3,列约束是3 2 1。可能的整数网格是:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 1│0 0 1│0 0 1│0 1 0│0 1 0│0 1 0│0 1 0│1 0 0│1 0 0│1 0 0│1 0 0│1 0 0│
│0 2 0│1 1 0│2 0 0│0 1 1│1 0 1│1 1 0│2 0 0│0 1 1│0 2 0│1 0 1│1 1 0│2 0 0│
│3 0 0│2 1 0│1 2 0│3 0 0│2 1 0│2 0 1│1 1 1│2 1 0│2 0 1│1 2 0│1 1 1│0 2 1│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
在实践中,我的主要兴趣是网格的总和最多为 100,但更通用的解决方案会非常有趣。
【问题讨论】:
-
@tobias_k 约束可以比 10 大得多。我不知道在最坏的情况下你的建议有多快。我的意思是说,即使对所有 100^9 个可能的网格进行一次检查也太过分了。
-
啊,对不起,不知怎的,我以为每个单元格只能包含一个数字。当然,如果每个数都可以达到 min(nj, cj),那就不太可能了。
-
所以基本上你必须求解一个有 9 个变量的 6 个方程组,每个变量的形式为
0x11 + 0x12 + 0x13 + 1x21 + 1x22 + 1x23 + 0x31 + 0x32 + 0x33 = r2,其中xij是第 i 行第 j 列中的值。 -
假设您找到了一个解决方案,如果您在一个矩形中选择了四个条目,例如 [(0,0), (0,2), (1,0), (1,2) ],您应该能够将一对对角线增加某个值,并将另一对对角线减少相同的值,并发现一系列其他解决方案。
-
在 3x3 网格中,可能只有 8 个这样的矩形。我怀疑您可以确定每个范围的大小,然后将所有 8 个值相乘得到一个总数。