Angenommen, es gibt ein 2D-Array (m x n)
von Bits.Maximaler OR-Wert von 2D Array von Bits
Zum Beispiel:
1 0 0 1 0
1 0 1 0 0
1 0 1 1 0
0 0 0 0 1
hier, m = 4
, n = 5
.
I Flip kann (0
1
wird, wird 1
0
) die Bits in jeder Zeile. Wenn Sie die Bits in einer bestimmten Zeile spiegeln, spiegeln Sie die Bits .
Mein Ziel ist es, den maximalen Wert OR
zwischen einem bestimmten Paar von Zeilen zu erhalten.
Das heißt, wenn das gegebene Paar von Reihen (r1, r2)
ist, dann kann ich eine beliebige Anzahl von Zeilen Flip zwischen r1
und r2
, und ich soll den maximal möglichen OR
Wert aller Zeilen zwischen r1
und r2
finden.
In dem obigen Beispiel (man denke Arrays mit 1 basierten Index), wenn r1
= 1 und r2
= 4, I kann der 1. Reihe Flip zu erhalten. Nun, wenn ich den OR
Wert aller Zeilen von 1 bis 4 finde, erhalte ich den Wert 31
als den maximal möglichen Wert OR
(es kann andere Lösungen geben).
Auch wäre es schön, die Antwort für (r1, r1)
zu berechnen, (r1, r1+1)
, (r1, r1+2)
, ..., (r1, r2-1)
während das gleiche für (r1,r2)
berechnen.
Constraints
1 <= m x n <= 10^6
1 <= r1 <= r2 <= m
Eine einfache würde Brute-Force-Lösung, die eine Zeitkomplexität von O(2^m)
haben. Gibt es eine schnellere Möglichkeit, dies zu berechnen?
Was ist die Anwendung dieses Algorithmus? – bcdan
Ich verstehe nicht, wie Sie zu O (2^m) kommen, eine naive Iteration auf Zeilenpaare wäre eher O (m * n^2), wenn Sie ops Stück für Stück ausführen, oder O (n^2) Wenn m <= sizeof (some_machine_integer), weil der Prozessor die Bits parallel ausführen würde, nein? –
@ aka.nice Da es m Zeilen gibt, kann ich nC0, nC1, nC2, nC3, ..., nCn Zeilen auswählen, die gewendet werden sollen. Nun, nC0 + nC1 + nC2 + nC3 + ... + nCn = 2^n. –