#include <bits/stdc++.h>
using
namespace
std;
int
maximizeAnd(
int
i,
int
mask,
int
* A,
int
* B,
int
N,
vector<vector<
int
> >& dp)
{
if
(i == N)
return
0;
if
(dp[i][mask] != -1)
return
dp[i][mask];
for
(
int
j = 0; j < N; ++j) {
if
(!(mask & (1 << j))) {
dp[i][mask] = max(
dp[i][mask],
(A[i] & B[j])
+ maximizeAnd(i + 1, mask | (1 << j), A,
B, N, dp));
}
}
return
dp[i][mask];
}
int
maximizeAndUtil(
int
* A,
int
* B,
int
N)
{
vector<vector<
int
> > dp(
N, vector<
int
>(1 << N + 1, -1));
return
maximizeAnd(0, 0, A, B, N, dp);
}
int
main()
{
int
A[] = { 3, 5, 7, 11 };
int
B[] = { 2, 6, 10, 12 };
int
N =
sizeof
A /
sizeof
A[0];
cout << maximizeAndUtil(A, B, N);
}
Original page link
Best Cool Tech Gadgets
Top favorite technology gadgets
0 comments:
Post a Comment