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
負の要素から最小の数までの最短経路の 1 つと、そこにある各セルを作成することで、これを試しました。
まず、開始セルと終了セルを含めます。
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]]
マトリックスの右「半分」に向かってマイナスを「押す」ことによって。
「半分」について言えば、マトリックスのパーティションを使用するというアイデアも (たくさん) 試しましたが、使用可能なパターンは見当たりませんでした。
私が試したことのほとんどは、私を元のマトリックスに戻し、私たちが観察できるこの「雪崩効果」は私を夢中にさせます.
この問題を解決するための良いアプローチは何でしょうか?