对于空白n * n矩阵,甚至是n,我们想要为此矩阵分配零和1 对于给定的n,每行和每列恰好包含n / 2个零和n / 2个。
有没有动态编程方法来解决这个问题?我已经将基本情况作为0用于大小为0的矩阵,然后将2个矩阵用于n = 2.但是我无法得到递归方程。 最近在接受微软采访时我被问到这个问题。
答案 0 :(得分:1)
如果您准备接受不切实际的大型状态空间,则可以对动态编程执行任何操作。在您的情况下,假设我们从左到右按列工作。在步骤k,我们将计算用包含n / 2 0s和n / 2 1s的列填充矩阵的前k列的不同方式的数量,并且我们知道,对于每个不同的状态,不同的数量填写矩阵的第一个k-1列的方法。
一个州代表什么?我们需要它足够详细,当我们完成时,我们知道每行包含n / 2 0s和n / 2 1s。我认为最好的是状态告诉我们,对于每个可行的i,到目前为止已经接收到i 1s的行数。因此,在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 1s,2具有相等的分割,1行没有1,或4行都具有相等的分割。鉴于此,我们可以计算出属于每个州的部分矩阵的数量。
这是一个动态编程解决方案,但是通过计算大矩阵的中途数量不同的部分计数本身就很大,你可以看到编程是非平凡的。我想知道是否有更好的方法来做到这一点?
答案 1 :(得分:0)
答案 2 :(得分:0)