对于一个空的n * n矩阵,其中n为偶数,我们想要将0和1分配给这个矩阵,使得每行和每列恰好包含n/2个0和n/2个1。
是否可以使用动态规划方法来解决这个问题?我已经处理了大小为0的矩阵的基本情况为0,然后对于n = 2,处理了两个矩阵。但是我无法得到递归方程。我最近在微软公司的面试中被问到了这个问题。
对于一个空的n * n矩阵,其中n为偶数,我们想要将0和1分配给这个矩阵,使得每行和每列恰好包含n/2个0和n/2个1。
是否可以使用动态规划方法来解决这个问题?我已经处理了大小为0的矩阵的基本情况为0,然后对于n = 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行都平均分配。鉴于此,我们可以计算出每个状态所属的部分矩阵数量。
这是一种动态规划解决方案,但在计算大型矩阵的中途,不同的部分计数数量本身就会很大,而且你可以看到编程并不容易。我想知道是否有更好的方法来解决这个问题?
对于这个问题,DP似乎有些过度了。在每个单元格之间交替使用零和一是否可行?就像棋盘一样。