Given an array of integers arr[]. The task is to find the maximum sum of set bits(of the array elements) without adding the set bits of adjacent elements of the array.
Examples:
Input : arr[] = {1, 2, 4, 5, 6, 7, 20, 25} Output : 9 Input : arr[] = {5, 7, 9, 5, 13, 7, 20, 25} Output : 11
Approach:
- First of all, find the total number of set bits for every element of the array and store them in a different array or the same array(to avoid using extra space).
- Now, the problem is reduced to find the maximum sum in the array such that no two elements are adjacent.
- Loop for all elements in arr[] and maintain two sums incl and excl where incl = Max sum including the previous element and excl = Max sum excluding the previous element.
- Max sum excluding the current element will be max(incl, excl) and max sum including the current element will be excl + current element (Note that only excl is considered because elements cannot be adjacent).
- At the end of the loop return max of incl and excl.
Below is the implementation of the above approach:
C++
// C++ program to maximum set bit sum in array // without considering adjacent elements #include<bits/stdc++.h> using namespace std; // Function to count total number // of set bits in an integer int bit( int n) { int count = 0; while (n) { count++; n = n & (n - 1); } return count; } // Maximum sum of set bits int maxSumOfBits( int arr[], int n) { // Calculate total number of // set bits for every element // of the array for ( int i = 0; i < n; i++) { // find total set bits for // each number and store // back into the array arr[i] = bit(arr[i]); } int incl = arr[0]; int excl = 0; int excl_new; for ( int i = 1; i < n; i++) { // current max excluding i excl_new = (incl > excl) ? incl : excl; // current max including i incl = excl + arr[i]; excl = excl_new; } // return max of incl and excl return ((incl > excl) ? incl : excl); } // Driver code int main() { int arr[] = {1, 2, 4, 5, 6, 7, 20, 25}; int n = sizeof (arr) / sizeof (arr[0]); cout << maxSumOfBits(arr, n); return 0; } |
Java
// Java program to maximum set bit sum in array // without considering adjacent elements import java.util.*; import java.lang.*; import java.io.*; class GFG { // Function to count total number // of set bits in an integer static int bit( int n) { int count = 0 ; while (n > 0 ) { count++; n = n & (n - 1 ); } return count; } // Maximum sum of set bits static int maxSumOfBits( int arr[], int n) { // Calculate total number of set bits // for every element of the array for ( int i = 0 ; i < n; i++) { // find total set bits for // each number and store // back into the array arr[i] = bit(arr[i]); } int incl = arr[ 0 ]; int excl = 0 ; int excl_new; for ( int i = 1 ; i < n; i++) { // current max excluding i excl_new = (incl > excl) ? incl : excl; // current max including i incl = excl + arr[i]; excl = excl_new; } // return max of incl and excl return ((incl > excl) ? incl : excl); } // Driver code public static void main(String args[]) { int arr[] = { 1 , 2 , 4 , 5 , 6 , 7 , 20 , 25 }; int n = arr.length; System.out.print(maxSumOfBits(arr, n)); } } // This code is contributed // by Subhadeep |
Python3
# Python3 program to maximum set bit sum in # array without considering adjacent elements # Function to count total number # of set bits in an integer def bit(n): count = 0 while (n): count + = 1 n = n & (n - 1 ) return count # Maximum sum of set bits def maxSumOfBits(arr, n): # Calculate total number of set bits # for every element of the array for i in range ( n): # find total set bits for each # number and store back into the array arr[i] = bit(arr[i]) incl = arr[ 0 ] excl = 0 for i in range ( 1 , n) : # current max excluding i if incl > excl: excl_new = incl else : excl_new = excl # current max including i incl = excl + arr[i]; excl = excl_new # return max of incl and excl if incl > excl: return incl else : return excl # Driver code if __name__ = = "__main__" : arr = [ 1 , 2 , 4 , 5 , 6 , 7 , 20 , 25 ] n = len (arr) print (maxSumOfBits(arr, n)) # This code is contributed by ita_c |
C#
// C# program to maximum set bit sum in array // without considering adjacent elements using System; class GFG { // Function to count total number // of set bits in an integer static int bit( int n) { int count = 0; while (n > 0) { count++; n = n & (n - 1); } return count; } // Maximum sum of set bits static int maxSumOfBits( int []arr, int n) { // Calculate total number of set bits // for every element of the array for ( int i = 0; i < n; i++) { // find total set bits for // each number and store // back into the array arr[i] = bit(arr[i]); } int incl = arr[0]; int excl = 0; int excl_new; for ( int i = 1; i < n; i++) { // current max excluding i excl_new = (incl > excl) ? incl : excl; // current max including i incl = excl + arr[i]; excl = excl_new; } // return max of incl and excl return ((incl > excl) ? incl : excl); } // Driver code public static void Main() { int []arr = {1, 2, 4, 5, 6, 7, 20, 25}; int n = arr.Length; Console.WriteLine(maxSumOfBits(arr, n)); } } // This code is contributed // by chandan_jnu. |
PHP
<?php // PHP program to maximum set bit sum in array // without considering adjacent elements // Function to count total number // of set bits in an integer function bit( $n ) { $count = 0; while ( $n ) { $count ++; $n = $n & ( $n - 1); } return $count ; } // Maximum sum of set bits function maxSumOfBits( $arr , $n ) { // Calculate total number of // set bits for every element // of the array for ( $i = 0; $i < $n ; $i ++) { // find total set bits for // each number and store // back into the array $arr [ $i ] = bit( $arr [ $i ]); } $incl = $arr [0]; $excl = 0; $excl_new ; for ( $i = 1; $i < $n ; $i ++) { // current max excluding i $excl_new = ( $incl > $excl ) ? $incl : $excl ; // current max including i $incl = $excl + $arr [ $i ]; $excl = $excl_new ; } // return max of incl and excl return (( $incl > $excl ) ? $incl : $excl ); } // Driver code $arr = array (1, 2, 4, 5, 6, 7, 20, 25); $n = sizeof( $arr ) / sizeof( $arr [0]); echo maxSumOfBits( $arr , $n ); #This Code is Contributed by ajit ?> |
Javascript
<script> // Javascript program to maximum // set bit sum in array // without considering adjacent elements // Function to count total number // of set bits in an integer function bit(n) { let count = 0; while (n > 0) { count++; n = n & (n - 1); } return count; } // Maximum sum of set bits function maxSumOfBits(arr, n) { // Calculate total number of set bits // for every element of the array for (let i = 0; i < n; i++) { // find total set bits for // each number and store // back into the array arr[i] = bit(arr[i]); } let incl = arr[0]; let excl = 0; let excl_new; for (let i = 1; i < n; i++) { // current max excluding i excl_new = (incl > excl) ? incl : excl; // current max including i incl = excl + arr[i]; excl = excl_new; } // return max of incl and excl return ((incl > excl) ? incl : excl); } let arr = [1, 2, 4, 5, 6, 7, 20, 25]; let n = arr.length; document.write(maxSumOfBits(arr, n)); </script> |
9
complexity Analysis:
- Time Complexity: O(Nlogn)
- Auxiliary Space: O(1)
Note: Above code can be optimised to O(N) using __builtin_popcount function to count set bits in O(1) time.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!