Bit Manipulation
Array
Dynamic Programming
Description
You are given an integer array nums
and a positive integer k
.
The value of a sequence seq
of size 2 * x
is defined as:
(seq[0] OR seq[1] OR ... OR seq[x - 1]) XOR (seq[x] OR seq[x + 1] OR ... OR seq[2 * x - 1])
.
Return the maximum value of any subsequence of nums
having size 2 * k
.
Example 1:
Input: nums = [2,6,7], k = 1
Output: 5
Explanation:
The subsequence [2, 7]
has the maximum value of 2 XOR 7 = 5
.
Example 2:
Input: nums = [4,2,5,6,7], k = 2
Output: 2
Explanation:
The subsequence [4, 5, 6, 7]
has the maximum value of (4 OR 5) XOR (6 OR 7) = 2
.
Constraints:
2 <= nums.length <= 400
1 <= nums[i] < 27
1 <= k <= nums.length / 2
Solutions
Solution 1: Dynamic Programming + Prefix and Suffix Decomposition + Enumeration
We consider dividing the sequence into two parts, the first $k$ elements and the last $k$ elements, and calculate all possible XOR values for the prefixes and suffixes.
Define $f[i][j][x]$ to represent whether there exists a subset with an XOR value of $x$ by taking $j$ elements from the first $i$ elements. Define $g[i][j][y]$ to represent whether there exists a subset with an XOR value of $y$ by taking $j$ elements starting from index $i$.
Consider the transition equation for $f[i][j][x]$. For the $i$-th element (starting from $0$), we can choose to take it or not, so we have:
$$
f[i + 1][j][x] = f[i + 1][j][x] \lor f[i][j][x] \
f[i + 1][j + 1][x \lor \text{nums}[i]] = f[i + 1][j + 1][x \lor \text{nums}[i]] \lor f[i][j][x]
$$
For the transition equation of $g[i][j][y]$, similarly for the $i$-th element (starting from $n - 1$), we can choose to take it or not, so we have:
$$
g[i - 1][j][y] = g[i - 1][j][y] \lor g[i][j][y] \
g[i - 1][j + 1][y \lor \text{nums}[i - 1]] = g[i - 1][j + 1][y \lor \text{nums}[i - 1]] \lor g[i][j][y]
$$
Finally, we enumerate $i$ in the range $[k, n - k]$. For each $i$, we enumerate $x$ and $y$, where $0 \leq x, y < 2^7$. If both $f[i][k][x]$ and $g[i][k][y]$ are true, we update the answer $\text{ans} = \max(\text{ans}, x \oplus y)$.
The time complexity is $O(n \times m \times k)$, and the space complexity is $O(n \times m \times k)$, where $n$ is the length of the array, and $m = 2^7$.
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 class Solution :
def maxValue ( self , nums : List [ int ], k : int ) -> int :
m = 1 << 7
n = len ( nums )
f = [[[ False ] * m for _ in range ( k + 2 )] for _ in range ( n + 1 )]
f [ 0 ][ 0 ][ 0 ] = True
for i in range ( n ):
for j in range ( k + 1 ):
for x in range ( m ):
f [ i + 1 ][ j ][ x ] |= f [ i ][ j ][ x ]
f [ i + 1 ][ j + 1 ][ x | nums [ i ]] |= f [ i ][ j ][ x ]
g = [[[ False ] * m for _ in range ( k + 2 )] for _ in range ( n + 1 )]
g [ n ][ 0 ][ 0 ] = True
for i in range ( n , 0 , - 1 ):
for j in range ( k + 1 ):
for y in range ( m ):
g [ i - 1 ][ j ][ y ] |= g [ i ][ j ][ y ]
g [ i - 1 ][ j + 1 ][ y | nums [ i - 1 ]] |= g [ i ][ j ][ y ]
ans = 0
for i in range ( k , n - k + 1 ):
for x in range ( m ):
if f [ i ][ k ][ x ]:
for y in range ( m ):
if g [ i ][ k ][ y ]:
ans = max ( ans , x ^ y )
return ans
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 class Solution {
public int maxValue ( int [] nums , int k ) {
int m = 1 << 7 ;
int n = nums . length ;
boolean [][][] f = new boolean [ n + 1 ][ k + 2 ][ m ] ;
f [ 0 ][ 0 ][ 0 ] = true ;
for ( int i = 0 ; i < n ; i ++ ) {
for ( int j = 0 ; j <= k ; j ++ ) {
for ( int x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ j ][ x ] ) {
f [ i + 1 ][ j ][ x ] = true ;
f [ i + 1 ][ j + 1 ][ x | nums [ i ]] = true ;
}
}
}
}
boolean [][][] g = new boolean [ n + 1 ][ k + 2 ][ m ] ;
g [ n ][ 0 ][ 0 ] = true ;
for ( int i = n ; i > 0 ; i -- ) {
for ( int j = 0 ; j <= k ; j ++ ) {
for ( int y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ j ][ y ] ) {
g [ i - 1 ][ j ][ y ] = true ;
g [ i - 1 ][ j + 1 ][ y | nums [ i - 1 ]] = true ;
}
}
}
}
int ans = 0 ;
for ( int i = k ; i <= n - k ; i ++ ) {
for ( int x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ k ][ x ] ) {
for ( int y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ k ][ y ] ) {
ans = Math . max ( ans , x ^ y );
}
}
}
}
}
return ans ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 class Solution {
public :
int maxValue ( vector < int >& nums , int k ) {
int m = 1 << 7 ;
int n = nums . size ();
vector < vector < vector < bool >>> f ( n + 1 , vector < vector < bool >> ( k + 2 , vector < bool > ( m , false )));
f [ 0 ][ 0 ][ 0 ] = true ;
for ( int i = 0 ; i < n ; i ++ ) {
for ( int j = 0 ; j <= k ; j ++ ) {
for ( int x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ j ][ x ]) {
f [ i + 1 ][ j ][ x ] = true ;
f [ i + 1 ][ j + 1 ][ x | nums [ i ]] = true ;
}
}
}
}
vector < vector < vector < bool >>> g ( n + 1 , vector < vector < bool >> ( k + 2 , vector < bool > ( m , false )));
g [ n ][ 0 ][ 0 ] = true ;
for ( int i = n ; i > 0 ; i -- ) {
for ( int j = 0 ; j <= k ; j ++ ) {
for ( int y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ j ][ y ]) {
g [ i - 1 ][ j ][ y ] = true ;
g [ i - 1 ][ j + 1 ][ y | nums [ i - 1 ]] = true ;
}
}
}
}
int ans = 0 ;
for ( int i = k ; i <= n - k ; i ++ ) {
for ( int x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ k ][ x ]) {
for ( int y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ k ][ y ]) {
ans = max ( ans , x ^ y );
}
}
}
}
}
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 func maxValue ( nums [] int , k int ) int {
m := 1 << 7
n := len ( nums )
f := make ([][][] bool , n + 1 )
for i := range f {
f [ i ] = make ([][] bool , k + 2 )
for j := range f [ i ] {
f [ i ][ j ] = make ([] bool , m )
}
}
f [ 0 ][ 0 ][ 0 ] = true
for i := 0 ; i < n ; i ++ {
for j := 0 ; j <= k ; j ++ {
for x := 0 ; x < m ; x ++ {
if f [ i ][ j ][ x ] {
f [ i + 1 ][ j ][ x ] = true
f [ i + 1 ][ j + 1 ][ x | nums [ i ]] = true
}
}
}
}
g := make ([][][] bool , n + 1 )
for i := range g {
g [ i ] = make ([][] bool , k + 2 )
for j := range g [ i ] {
g [ i ][ j ] = make ([] bool , m )
}
}
g [ n ][ 0 ][ 0 ] = true
for i := n ; i > 0 ; i -- {
for j := 0 ; j <= k ; j ++ {
for y := 0 ; y < m ; y ++ {
if g [ i ][ j ][ y ] {
g [ i - 1 ][ j ][ y ] = true
g [ i - 1 ][ j + 1 ][ y | nums [ i - 1 ]] = true
}
}
}
}
ans := 0
for i := k ; i <= n - k ; i ++ {
for x := 0 ; x < m ; x ++ {
if f [ i ][ k ][ x ] {
for y := 0 ; y < m ; y ++ {
if g [ i ][ k ][ y ] {
ans = max ( ans , x ^ y )
}
}
}
}
}
return ans
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 function maxValue ( nums : number [], k : number ) : number {
const m = 1 << 7 ;
const n = nums . length ;
const f : boolean [][][] = Array . from ({ length : n + 1 }, () =>
Array . from ({ length : k + 2 }, () => Array ( m ). fill ( false )),
);
f [ 0 ][ 0 ][ 0 ] = true ;
for ( let i = 0 ; i < n ; i ++ ) {
for ( let j = 0 ; j <= k ; j ++ ) {
for ( let x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ j ][ x ]) {
f [ i + 1 ][ j ][ x ] = true ;
f [ i + 1 ][ j + 1 ][ x | nums [ i ]] = true ;
}
}
}
}
const g : boolean [][][] = Array . from ({ length : n + 1 }, () =>
Array . from ({ length : k + 2 }, () => Array ( m ). fill ( false )),
);
g [ n ][ 0 ][ 0 ] = true ;
for ( let i = n ; i > 0 ; i -- ) {
for ( let j = 0 ; j <= k ; j ++ ) {
for ( let y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ j ][ y ]) {
g [ i - 1 ][ j ][ y ] = true ;
g [ i - 1 ][ j + 1 ][ y | nums [ i - 1 ]] = true ;
}
}
}
}
let ans = 0 ;
for ( let i = k ; i <= n - k ; i ++ ) {
for ( let x = 0 ; x < m ; x ++ ) {
if ( f [ i ][ k ][ x ]) {
for ( let y = 0 ; y < m ; y ++ ) {
if ( g [ i ][ k ][ y ]) {
ans = Math . max ( ans , x ^ y );
}
}
}
}
}
return ans ;
}
GitHub