C++ nx3数组中数字的最小和,因此每个列和行都在其中表示
这是算法问题的一部分,我已经连续第三天和它斗争了。所以我们得到了一个3xn数组(n行,3列)。我们需要找到最小的总和,例如:C++ nx3数组中数字的最小和,因此每个列和行都在其中表示,c++,arrays,algorithm,sorting,greedy,C++,Arrays,Algorithm,Sorting,Greedy,这是算法问题的一部分,我已经连续第三天和它斗争了。所以我们得到了一个3xn数组(n行,3列)。我们需要找到最小的总和,例如: 我们只从每行中选择一个元素 每行都必须表示,因此在这样的总和中,每行必须正好有一个数字 每列都必须表示,因此必须至少有一个数字位于第一列,至少有一个位于第二列,至少有一个位于第三列 让我们用这个数组来说明问题: 6 2 4 8 7 5 6 2 4 9 6 5 这种情况下的最小和为8(第1列,第2行)+2(第2列,第1行)+5(第3列,第4行)+2(第2列,第3行)=
- 我们只从每行中选择一个元素
- 每行都必须表示,因此在这样的总和中,每行必须正好有一个数字
- 每列都必须表示,因此必须至少有一个数字位于第一列,至少有一个位于第二列,至少有一个位于第三列
6 2 4
8 7 5
6 2 4
9 6 5
这种情况下的最小和为8(第1列,第2行)+2(第2列,第1行)+5(第3列,第4行)+2(第2列,第3行)=17
我试图以贪婪的方式解决这个问题,我创建了该数组的三个副本,按各自的列对每个副本进行排序,然后在3中尝试代码>使三个数字之和最小,并将其余数字的最小值相加的方法,但上述情况的解决方案是:
6(第1列,第3行)+2(第2列,第1行)+5(第3列,第4行)+剩余5(第3列,第2行)=18
,因此贪婪的方法被证明是不成功的。有没有人建议我应该改变我的方法,使之成为有效的方法?在所有行中循环,并在每行中选择该行中最小的元素。(这是O(n)。)
现在有3种可能性:
拾取的图元覆盖所有3列。我们完了
拾取的图元包含两列:
再次遍历所有行,并考虑缺失行中元素与所选元素之间的差异。
找到差异最小的行并切换该行中的选项。我们完了。(这是O(n)。)
拾取的图元仅覆盖一列:
再次遍历所有行,并考虑第一个缺失行中的元素和所选元素之间的差异,以及第二个缺失行中的元素与所选元素之间的差异。
查找第一个缺失行中的元素与拾取的元素之间差异最小和第二小的两行
查找第二个缺失行中的元素与拾取的元素之间存在最小和第二小差异的两行
现在你只需考虑切换的四种可能性,选择哪一种更好(满足约束条件)。我们完了。(这是在O(n)中完成的。)
你试过我的解决方案了吗,还是还有什么不清楚的地方?