ビットの2次元配列(m x n)
があるとします。例えばビットの2D配列の最大OR値
:ここ
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
0 0 0 0 1
、m = 4
、n = 5
。
0
は1
になります。1
は0
になります。任意の行のビットです。特定の行のビットを反転すると、すべてのビットが反転します。
私の目標は、与えられた行の間に最大OR
の値を得ることです。
行の所与の対が(r1, r2)
である場合、私はr1
とr2
間の行の任意の数を反転することができ、そしてIはr1
とr2
間のすべての行の最大可能OR
値を見つけるべきです。
r1
= 1とr2
= 4の場合、上記の例(1から始まるインデックスを持つ配列を考慮)では、最初の行を反転してにすることができます。今、私が1から4までのすべての行のOR
の値を見つけたら、31
の値を最大でOR
という値にします(他の解決策もあります)。
また、(r1, r1)
、(r1, r1+1)
、(r1, r1+2)
のための答えを計算するためにいいだろう...、(r1, r2-1)
(r1,r2)
のために同じことを計算しながら。
制約
1 <= m x n <= 10^6
1 <= r1 <= r2 <= m
、単純なブルートフォースソリューションはO(2^m)
の時間の複雑さを持っているでしょう。 これを高速に計算する方法はありますか?
このアルゴリズムのアプリケーションとは何ですか? – bcdan
あなたはO(2^m)に来る方法を理解していません。ビットごとにopsを実行する場合は、行ペアの素朴な繰り返しはO(m * n^2)、O(n^2) m <= sizeof(some_machine_integer)の場合、プロセッサーはビットストップを並列に実行するため、いいえ? –
@ aka.nice m行ありますので、反転するnC0、nC1、nC2、nC3、...、nCn行を選択できます。ここで、nC0 + nC1 + nC2 + nC3 + ... + nCn = 2^n。 –