Rearrange an array to maximize sum of Bitwise AND of same | Function to implement recursive DP ; If i is equal to N ; If dp [ i ] [ mask ] is not equal to - 1 ; Iterate over the array B [ ] ; If current element is not yet selected ; Update dp [ i ] [ mask ] ; Return dp [ i ] [ mask ] ; Function to obtain maximum sum of Bitwise AND of same - indexed elements from the arrays A [ ] and B [ ] ; Stores all dp - states ; Returns the maximum value returned by the function maximizeAnd ( ) ; Driver Code
function maximizeAnd ( i , mask , A , B , N , dp ) { if ( i == N ) return 0 ; if ( dp [ i ] [ mask ] != - 1 ) return dp [ i ] [ mask ] ; for ( var j = 0 ; j < N ; ++ j ) { if ( ! ( mask & ( 1 << j ) ) ) { dp [ i ] [ mask ] = Math . max ( dp [ i ] [ mask ] , ( A [ i ] & B [ j ] ) + maximizeAnd ( i + 1 , mask | ( 1 << j ) , A , B , N , dp ) ) ; } } return dp [ i ] [ mask ] ; } function maximizeAndUtil ( A , B , N ) { var dp = Array . from ( Array ( N ) , ( ) => Array ( 1 << N + 1 ) . fill ( - 1 ) ) ; return maximizeAnd ( 0 , 0 , A , B , N , dp ) ; } var A = [ 3 , 5 , 7 , 11 ] ; var B = [ 2 , 6 , 10 , 12 ] ; var N = A . length document . write ( maximizeAndUtil ( A , B , N ) ) ;