class
GFG
{
static
boolean
checkpossible(
int
mask,
int
arr[],
int
prefix[],
int
n,
int
k)
{
int
i,j;
boolean
dp[][] =
new
boolean
[n +
1
][k +
1
];
for
(i =
0
; i < n +
1
; i++)
{
for
(j =
0
; j < k +
1
; j++)
{
dp[i][j] =
false
;
}
}
dp[
0
][
0
] =
true
;
for
( i =
1
; i <= n; i++)
{
for
(j =
1
; j <= k; j++)
{
for
(
int
l = i -
1
; l >=
0
; --l)
{
if
(dp[l][j -
1
] && (((prefix[i] - prefix[l])
& mask) == mask))
{
dp[i][j] =
true
;
break
;
}
}
}
}
return
dp[n][k];
}
static
int
Partition(
int
arr[],
int
n,
int
k)
{
int
prefix[] =
new
int
[n+
1
];
for
(
int
i =
1
; i <= n; i++)
{
prefix[i] = prefix[i -
1
] + arr[i];
}
int
LOGS =
20
;
int
ans =
0
;
for
(
int
i = LOGS; i >=
0
; --i)
{
if
(checkpossible(ans | (
1
<< i), arr, prefix, n, k))
{
ans = ans | (
1
<< i);
}
}
return
ans;
}
public
static
void
main (String[] args)
{
int
arr[] = {
0
,
1
,
2
,
7
,
10
,
23
,
21
,
6
,
8
,
7
,
3
}, k =
2
;
int
n = arr.length -
1
;
System.out.println(Partition(arr, n, k));
}
}