Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算给定n行和列中正好有n/2个零和n/2个1的矩阵数_Java_C_Algorithm_Combinatorics_Dynamic Programming - Fatal编程技术网

Java 计算给定n行和列中正好有n/2个零和n/2个1的矩阵数

Java 计算给定n行和列中正好有n/2个零和n/2个1的矩阵数,java,c,algorithm,combinatorics,dynamic-programming,Java,C,Algorithm,Combinatorics,Dynamic Programming,对于一个空的n*n矩阵,即使是n,我们想给这个矩阵分配0和1,所以 对于给定的n,每行和每列正好包含n/2个零和n/2个一 有没有一种动态规划方法可以解决这个问题?对于大小为0的矩阵,我的基本情况是0,对于n=2,则是2个矩阵。但是我不能得到递归方程。 在最近一次微软的采访中,我被问到了这一点。DP看起来像是过度杀戮。将在0和1之间为每个单元交替工作。有点像棋盘。如果你准备接受一个不切实际的大状态空间,你可以用动态编程做任何事情。在您的例子中,假设我们从左到右按列工作。在步骤k中,我们将计算用包

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

有没有一种动态规划方法可以解决这个问题?对于大小为0的矩阵,我的基本情况是0,对于n=2,则是2个矩阵。但是我不能得到递归方程。
在最近一次微软的采访中,我被问到了这一点。

DP看起来像是过度杀戮。将在0和1之间为每个单元交替工作。有点像棋盘。

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

国家代表什么?我们需要足够详细,当我们完成时,我们知道每一行包含n/20和n/21。我认为最好的办法是,州政府告诉我们,对于每个可行的I,到目前为止已经收到I 1的行数。因此,在4x4矩阵的中间,我们的状态可能会告诉我们,2行有2个1,2行有0个1,或者,对于不同的状态,所有4行都收到了一个1。最后,我们只考虑与状态相关的计数,它告诉我们每一行确实接收到确切的N/2 1S。 对于我们的4x4示例,在k=1时,只有一种可能的状态:两行接收到单个1,两行接收到单个0。我们可以使用回溯搜索来计算可能的后继状态——2行2个1,2行0个1,1行2个1,两行等分,1行无1,或者4行等分。考虑到这一点,我们可以计算出属于每个状态的部分矩阵的数目


这是一个动态规划的解决方案,但是在计算一个大矩阵的过程中,不同的部分计数的数量会很大,你可以看到这个规划是非常重要的。我想知道是否有更好的方法可以做到这一点?

在这里找到了DP版本:

这里有一个非常清楚的分析:我在寻找一个递归方程。我认为这一个需要一个递归,我不认为存在递归方程,因为较大尺寸的矩阵比仅组合较小尺寸的矩阵有更多的可能性。例如,对于n=4,矩阵[1100011000111001]根本没有大小为n=2的好的子矩阵。它不起作用。你所指的可能会导致一种计算所有此类矩阵的蛮力方法,但必须有一种递归或更好的算法来计算此类矩阵。蛮力太贵了..发现这个:嗯,我想你的面试官是这么想的,而不是我们错过的组合数学中的一些聪明的想法。就我所见,这种方法更直接、更容易解释,但有更大的状态空间。