请教大家一个算法问题,如何计算 N*N 维矩阵中的 N 数之积,值最大,每行每列仅选一个

2019 年 10 月 2 日
 SheerCold

rt,不知道应该怎么实现了

3493 次点击
所在节点    问与答
20 条回复
ZRS
2019 年 10 月 2 日
如果可以保证矩阵元素都是大于 1 的,对每个元素取对数,用匈牙利算法求解。
Caturra
2019 年 10 月 2 日
只考虑正整数的话按行列拆分成二分图,边对应数的权值,然后跑 MCMF·改,把费用累加改成累乘(我瞎说的
oIMOo
2019 年 10 月 2 日
为什么楼上都看懂问题了……

比如 3*3 的矩阵:
1 2 3
7 4 2
9 6 3

N 数之积 -> 3 个数字的乘积

值最大,每行只选一个 -> 选每行最大的,分别是 3,7,9,然后乘起来不就好了么?
oIMOo
2019 年 10 月 2 日
@oIMOo 不对不对
我没看到每列…… 丢脸……
请无视我……
aneureka
2019 年 10 月 2 日
有丶八皇后简略版的意思?? 但我不知道直接回溯是不是复杂度会太高,如果楼主没有解决过这类问题建议看看八皇后。
midasplus
2019 年 10 月 2 日
好像可以上 KM……(?)
ilotuo
2019 年 10 月 2 日
我的思路:
先用 dfs 生成 range(1, n) 序列的排列组合, 共 n!种组合. 每个组合都有对应的乘积, 取组合中最大的一个即可.
如 3 楼的例子, 有组合 1,2,3 ; 1,3,2; 2,1,3; 2,3,1, ....
对应的乘积: 1*4*3; 1*2*6; 2*7*3; 2*2*9; ....
找其中最大的一个即可;
ilotuo
2019 年 10 月 2 日
组合--> 排列
说错了.
threebr
2019 年 10 月 2 日
用递归做搜索,思路上跟八皇后问题比较像
jtnwm
2019 年 10 月 2 日
看不太明白,这个答案是唯一的吗?
threebr
2019 年 10 月 2 日
@threebr 好吧,我想不出递归搜索的方法
zzyyzz1992
2019 年 10 月 2 日
动态规划老哥
billwsy
2019 年 10 月 2 日
@111qqz 我也觉得是 KM…但是不会写所以我选择费用流
optional
2019 年 10 月 2 日
乘积最大子序列 * N
optional
2019 年 10 月 2 日
不对 不对 列不能复选
dingyaguang117
2019 年 10 月 3 日
@zzyyzz1992
动态规划 O(N*2^N)) 感觉还是高
aguesuka
2019 年 10 月 3 日
任意两行交换不影响结果,我觉得线性代数里应该有好办法
optional
2019 年 10 月 5 日
@SheerCold
回来看到 @aguesuka 说的『交换行列不影响结果』大受启发,那么最终结果肯定可以交换行列成一个斜线。
先把求积变成求和,简化思考:只要在边缘找( n 行 n 列)一个合适的数字(对于求和就是数字最大),把它所在的行或者列交换到 0 行 0 列,然后递归(n-1)这个矩阵,就能找到这 n 个数字。
对于求积,无非稍微复杂点是做个 dp 而已,但是复杂度是一样的。
optional
2019 年 10 月 5 日
复杂度应该是 N^2
optional
2019 年 10 月 7 日
不对

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/606009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX