Java 如何在n*n矩阵中找到每个a(i,j)的条目,其中n<=900和a(i,j)=0或a(i,j)=1?

Java 如何在n*n矩阵中找到每个a(i,j)的条目,其中n<=900和a(i,j)=0或a(i,j)=1?,java,algorithm,Java,Algorithm,假设我已经给出了n个基本上为零的矩阵 并给出了与每行和每列相关联的和 例如,n=4 矩阵: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 给定行和:2,2,1,1 给定列总和:2,0,2,2 因此,输出矩阵应该如下所示: 0 0 1 1 1 0 0 1 0 0 1 0 1 0 0 0 总有解决办法的。 所以对于n=4,0你可以用贪婪的方法来解决这个问题 while not filled: find biggest unfilled row: f

假设我已经给出了n个基本上为零的矩阵

并给出了与每行和每列相关联的和

例如,
n=4

矩阵:

0 0 0 0 
0 0 0 0 
0 0 0 0 
0 0 0 0
给定行和:
2,2,1,1

给定列总和:
2,0,2,2

因此,输出矩阵应该如下所示:

0 0 1 1
1 0 0 1
0 0 1 0
1 0 0 0
总有解决办法的。
所以对于
n=4
0你可以用贪婪的方法来解决这个问题

while not filled:
    find biggest unfilled row:
        fill in putting 1s in columns with largest sums
在您的案例中,您从以下方面开始:

    2 2 0 2
  ----------
2 | _ _ _ _
2 | _ _ _ _
1 | _ _ _ _
1 | _ _ _ _
填写我们得到的其中一行:

    1 1 0 2
  ----------
2 | _ _ _ _
  | 1 1 0 0
1 | _ _ _ _
1 | _ _ _ _
填写另一份:

      1   1
  ----------
  | 1 0 0 1
  | 1 1 0 0
1 | _ _ _ _
1 | _ _ _ _
另外两个可以类似地填写:

  ----------
  | 1 0 0 1
  | 1 1 0 0
  | 0 1 0 0
  | 0 0 0 1

假设行值之和与列值之和匹配,并且
0b蒂利的答案适用于您。然而,它是可以改进的。不必每次都查找最大和的行和列,您可以通过按降序对它们进行排序来进行预处理,但重要的是要保存它们的原始位置。您可以使用一个简单的类:

class-SortedRow{
int-val;
国际原始索引;
公共分拣机(val,原始索引){
this.val=val;
this.originalIndex=originalIndex;
}
}
然后对它们进行排序(rowVals和colVals是具有所需总和的数组):

publicstaticvoid预处理(int[]rowVals,int[]colVals){
SortedRow[]行=新的SortedRow[n];
SortedRow[]cols=新的SortedRow[n];
对于(int i=0;i
现在,您可以像Btilly建议的那样,开始用贪婪的方法填充nxn矩阵,但您不必每次都寻找最大的一个——您已经拥有了它。通过新类的
originalIndex
字段填写


它将最坏情况下的运行时间从三次型改进为二次型:预处理在O(nlogn)中运行,如果您对
n
的值有一些先验知识,它甚至可以是线性的。填写矩阵以O(n^2)形式运行

到目前为止你试过什么?如果这样一个好问题因为缺乏努力而被关闭,那将是一个耻辱。输出矩阵应该是那个解决方案吗?还有更多的解决方案,例如1010 0011 00011000@harold任何解决方案都应该是好的,只要它与给定的匹配inputs@NitinSinghal请再解释一下你的问题。这总是可能的吗?。。。或者相反的方法,使用最小和和和零。最后一句可能需要额外的假设“[…],并且总是存在至少一个解,[…]”,因为例如“02”乘以“02”是不可解的。我认为,在立方时间内,这是一个应该很有效的算法。我忍不住想知道这件事是否能在二次方中完成。。。。除非对答案进行修改,说明此答案中的方法也可用于确定解决方案是否存在,在这种情况下,就我所知,我之前的评论是不相关的。@MelvinWM很好!如果失败,那么就没有解决方案。但是你想到了一种方法,我没有找到解决办法。