【问题标题】:Counting no of matrices with exactly n/2 zeros and n/2 ones in each row and each column for a given n计算给定 n 的每行和每列中恰好有 n/2 个零和 n/2 个的矩阵的数量
【发布时间】:2011-12-20 20:38:15
【问题描述】:

对于一个空白的 n * n 矩阵,即使是 n,我们要为这个矩阵分配 0 和 1,所以 对于给定的 n,每一行和每一列都恰好包含 n/2 个零和 n/2 个零。

是否有动态编程方法来解决这个问题?对于大小为 0 的矩阵,我将基本情况设为 0,然后将 n = 2 的矩阵设为 2。但我无法得到递归方程。 我最近在接受微软采访时被问到这个问题。

【问题讨论】:

  • 这里分析得很清楚:netcomuk.co.uk/~jenolive/roymagic.html
  • 我正在寻找一个递归方程。我认为我们必须对此进行递归..
  • 我不认为有一个递归方程,因为更大的尺寸比只组合更小的矩阵有更多的可能性。例如。对于 n=4,矩阵 [1100,0110,0011,1001] 根本没有大小为 n=2 的良好子矩阵。

标签: java c algorithm combinatorics dynamic-programming


【解决方案1】:

【讨论】:

    【解决方案2】:

    你可以用动态编程做任何事情——如果你准备好接受一个不切实际的大状态空间。在您的情况下,假设我们从左到右在列中工作。在第 k 步,我们将计算用包含 n/2 个 0 和 n/2 个 1 的列填充矩阵的前 k 列的不同方式的数量,并且我们知道,对于每个不同的状态,不同的方式的数量填充矩阵的前 k-1 列的方法。

    状态代表什么?我们需要它足够详细,当我们完成后,我们知道每一行包含 n/2 0 和 n/2 1。我认为最好的是状态告诉我们,对于每个可行的 i,到目前为止收到 i 1 的行数。因此,在 4x4 矩阵的中途,我们的状态可能告诉我们 2 行有 2 个 1,2 行有 0 个 1,或者,对于不同的状态,所有 4 行都收到一个 1。最后,我们只考虑与状态相关的计数告诉我们每一行确实确实收到了 n/2 个 1。

    对于我们的 4x4 示例,在 k = 1 时,只有一种可能的状态:2 行收到一个 1,两行收到一个 0。我们可以使用回溯搜索来计算可能的后续状态 - 2有 2 个 1 的行和 2 个有 0 个 1 的行,1 行有 2 个 1,两个有相等的分割,1 行没有 1,或 4 行都有相同的分割。鉴于此,我们可以计算出属于每个状态的部分矩阵的数量。

    这是一个动态编程解决方案,但是在计算出一个大矩阵的过程中,不同部分计数的数量本身就会很大,并且您可以看到编程是不平凡的。我想知道是否有更好的方法来做到这一点?

    【讨论】:

    • 找到这个:en.wikipedia.org/wiki/…
    • 嗯,我猜你的面试官正在考虑这一点,而不是我们错过的组合数学中的一些聪明想法。据我所知,这种方法更直接、更容易解释,但状态空间更大。
    【解决方案3】:

    为此,DP 看起来有点过头了。每个单元格工作时会在零和一之间交替。象棋盘之类的东西。

    【讨论】:

    • 这行不通。您所指的可能会导致计算所有此类矩阵的蛮力方法,但必须有递归或更好的算法来计算此类矩阵。蛮力太贵了..
    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2011-05-27
    • 2013-09-18
    • 2015-10-19
    • 2017-11-16
    • 2015-01-15
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多