假設有一個二維數組位(m x n)
位。二維位數組的最大或值
例如:
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
之間,我應該找到r1
和r2
之間的所有行的最大可能OR
值。
在上面的例子中(考慮基於1的索引的數組),如果r1
= 1和r2
= 4,我可以翻轉第一行得到。現在,如果我找到從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),如果你一點一點地執行操作,或者O(n^2),那麼在行對上的天真迭代寧可是O(m * n^2)如果m <= sizeof(some_machine_integer),因爲處理器會並行執行bit,否? –
@ aka.nice由於有m行,我可以選擇nC0,nC1,nC2,nC3,...,nCn行進行翻轉。現在,nC0 + nC1 + nC2 + nC3 + ... + nCn = 2^n。 –