有一个M
大小m, n
超过整数的矩阵,什么是一个好的算法来转换它,使得所有元素的总和是最大的?
唯一允许的操作是逐-1
列或逐行相乘。可以根据需要执行尽可能多的此类操作。
粗略的,总体思路:我的想法是将每个负号从一个这样的负数移动到其值最小的正数,这样减号对总和的影响最小。
让我们举个例子:
import numpy as np
M = np.matrix([
[2,2,2,2],
[2,2,-2,2],
[2,2,2,2],
[2,2,2,1],
])
def invert_at(M, n, m):
M[n,:] *= -1
M[:,m] *= -1
我已经尝试过构建从负元素到最小数字的最短路径之一以及invert_at
沿途的每个单元格。
首先包括开始和结束单元格:
invert_at(M, 1, 2) # start
invert_at(M, 2, 2)
invert_at(M, 3, 2)
invert_at(M, 3, 3) # end
我最终得到:
[[ 2 2 -2 -2]
[-2 -2 -2 2]
[-2 -2 2 2]
[ 2 2 -2 -1]]
哪种看起来很有趣。它将减号推到右下角的 -1,但也推到其他一些区域。现在,如果我要在开始和结束位置(即-1 * -1 = 1
)再次反转,所以首先省略开始和结束单元格,我最终得到:
[[ 2 2 2 2]
[ 2 2 -2 2]
[-2 -2 -2 -2]
[-2 -2 -2 -1]]
看起来更好,考虑到我想要
[[ 2 2 2 2]
[ 2 2 2 2]
[ 2 2 2 2]
[ 2 2 2 -1]]
通过将减号“推”向矩阵的右“一半”。
谈到“一半”,我也玩过(很多)使用矩阵分区的想法,但我无法观察到任何可用的模式。
我尝试过的大多数事情都让我回到了原始矩阵,我们可以观察到的这种“雪崩效应”让我发疯。
解决这个问题的好方法是什么?