#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