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

2019-10-02 15:09:25 +08:00
 SheerCold

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

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

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

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

值最大,每行只选一个 -> 选每行最大的,分别是 3,7,9,然后乘起来不就好了么?
oIMOo
2019-10-02 15:48:31 +08:00
@oIMOo 不对不对
我没看到每列…… 丢脸……
请无视我……
aneureka
2019-10-02 16:28:27 +08:00
有丶八皇后简略版的意思?? 但我不知道直接回溯是不是复杂度会太高,如果楼主没有解决过这类问题建议看看八皇后。
111qqz
2019-10-02 16:36:58 +08:00
好像可以上 KM……(?)
ilotuo
2019-10-02 17:28:36 +08:00
我的思路:
先用 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-02 17:32:20 +08:00
组合--> 排列
说错了.
threebr
2019-10-02 17:42:33 +08:00
用递归做搜索,思路上跟八皇后问题比较像
jtnwm
2019-10-02 18:21:17 +08:00
看不太明白,这个答案是唯一的吗?
threebr
2019-10-02 18:24:54 +08:00
@threebr 好吧,我想不出递归搜索的方法
zzyyzz1992
2019-10-02 22:20:08 +08:00
动态规划老哥
billwsy
2019-10-02 23:12:46 +08:00
@111qqz 我也觉得是 KM…但是不会写所以我选择费用流
optional
2019-10-02 23:37:13 +08:00
乘积最大子序列 * N
optional
2019-10-02 23:38:01 +08:00
不对 不对 列不能复选
dingyaguang117
2019-10-03 09:26:43 +08:00
@zzyyzz1992
动态规划 O(N*2^N)) 感觉还是高
aguesuka
2019-10-03 10:58:33 +08:00
任意两行交换不影响结果,我觉得线性代数里应该有好办法
optional
2019-10-05 08:51:14 +08:00
@SheerCold
回来看到 @aguesuka 说的『交换行列不影响结果』大受启发,那么最终结果肯定可以交换行列成一个斜线。
先把求积变成求和,简化思考:只要在边缘找( n 行 n 列)一个合适的数字(对于求和就是数字最大),把它所在的行或者列交换到 0 行 0 列,然后递归(n-1)这个矩阵,就能找到这 n 个数字。
对于求积,无非稍微复杂点是做个 dp 而已,但是复杂度是一样的。
optional
2019-10-05 08:59:13 +08:00
复杂度应该是 N^2
optional
2019-10-07 20:52:12 +08:00
不对

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

https://www.v2ex.com/t/606009

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

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

© 2021 V2EX