Maximum sum in an array such that every element has exactly one adjacent element to it - GeeksforGeeks

13 May, 2021
Given an array arr[] of N integers, you can select some indexes such that every selected index has exactly one other selected index adjacent to it and the sum of elements at the chosen indexes should be maximum. In other words, the task is to select elements from an array such that a single element alone is not selected and elements at three consecutive indices are not selected and the sum of selected elements should be maximum. The task is to print the maximized sum.
Examples:  
Input: arr[] = {1, 2, 3, 1, 4} Output: 8 arr[0] + arr[1] + arr[3] + arr[4] = 1 + 2 + 1 + 4 = 8Input: arr[] = {1, 1, 1, 1} Output: 2  
Approach: Dynamic programming can be used to solve this problem. This problem can be translated to selecting pairs of adjacent integers such that no two pairs are adjacent or have an element in common i.e. if (arr[i], arr[i + 1]) is a pair we selected then neither (arr[i + 2], arr[i + 3]) nor (arr[i + 1], arr[i + 2]) can be selected. Let’s decide the states of the dp according to the above statement. For every index i, we will either select indexes i and i + 1 i.e. make a pair or not make it. In case, we make a pair, we won’t be able to select the index i + 2 as it will make 2 elements adjacent to i + 1. So, we will have to solve for i + 3 next. If we don’t make a pair, we will simply solve for i + 1. So the recurrence relation will be.  
dp[i] = max(arr[i] + arr[i + 1] + dp[i + 3], dp[i + 1]) 
There are N states in total and each state takes O(1) time to solve. Thus, the time complexity will be O(N).
Below is the implementation of the above approach: 
C++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include <bits/stdc++.h>#define arrSize 51using namespace std; // To store the states of dpint dp[arrSize];bool v[arrSize]; // Function to return the maximized sumint sumMax(int i, int arr[], int n){    // Base case    if (i >= n - 1)        return 0;     // Checks if a state is    // already solved    if (v[i])        return dp[i];    v[i] = true;     // Recurrence relation    dp[i] = max(arr[i] + arr[i + 1]                    + sumMax(i + 3, arr, n),                sumMax(i + 1, arr, n));     // Return the result    return dp[i];} // Driver codeint main(){    int arr[] = { 1, 1, 1, 1 };    int n = sizeof(arr) / sizeof(int);     cout << sumMax(0, arr, n);     return 0;}
// Java implementation of the approachimport java.io.*; class GFG{ static int arrSize = 51; // To store the states of dpstatic int dp[] = new int[arrSize];static boolean v[] = new boolean[arrSize]; // Function to return the maximized sumstatic int sumMax(int i, int arr[], int n){    // Base case    if (i >= n - 1)        return 0;     // Checks if a state is    // already solved    if (v[i])        return dp[i];    v[i] = true;     // Recurrence relation    dp[i] = Math.max(arr[i] + arr[i + 1]                    + sumMax(i + 3, arr, n),                sumMax(i + 1, arr, n));     // Return the result    return dp[i];} // Driver codepublic static void main (String[] args){    int arr[] = { 1, 1, 1, 1 };    int n = arr.length;     System.out.println(sumMax(0, arr, n));}} // This code is contributed by anuj_67..
# Python 3 implementation of the approacharrSize = 51 # To store the states of dpdp = [0 for i in range(arrSize)]v = [False for i in range(arrSize)] # Function to return the maximized sumdef sumMax(i,arr,n):    # Base case    if (i >= n - 1):        return 0     # Checks if a state is    # already solved    if (v[i]):        return dp[i]    v[i] = True    # Recurrence relation    dp[i] = max(arr[i] + arr[i + 1] + sumMax(i + 3, arr, n),                                        sumMax(i + 1, arr, n))    # Return the result    return dp[i] # Driver codeif __name__ == '__main__':    arr = [1, 1, 1, 1]    n = len(arr)    print(sumMax(0, arr, n)) # This code is contributed by# Surendra_Gangwar
// C# implementation of the approachusing System; class GFG{ static int arrSize = 51; // To store the states of dpstatic int []dp = new int[arrSize];static bool []v = new bool[arrSize]; // Function to return the maximized sumstatic int sumMax(int i, int []arr, int n){    // Base case    if (i >= n - 1)        return 0;     // Checks if a state is    // already solved    if (v[i])        return dp[i];    v[i] = true;     // Recurrence relation    dp[i] = Math.Max(arr[i] + arr[i + 1]                    + sumMax(i + 3, arr, n),                sumMax(i + 1, arr, n));     // Return the result    return dp[i];} // Driver codepublic static void Main (){    int []arr = { 1, 1, 1, 1 };    int n = arr.Length;     Console.WriteLine(sumMax(0, arr, n));}} // This code is contributed by anuj_67..
<script> // Javascript implementation of the approachvar arrSize = 51; // To store the states of dpvar dp = Array(arrSize);var v = Array(arrSize); // Function to return the maximized sumfunction sumMax(i, arr, n){    // Base case    if (i >= n - 1)        return 0;     // Checks if a state is    // already solved    if (v[i])        return dp[i];    v[i] = true;     // Recurrence relation    dp[i] = Math.max(arr[i] + arr[i + 1]                    + sumMax(i + 3, arr, n),                sumMax(i + 1, arr, n));     // Return the result    return dp[i];} // Driver codevar arr = [1, 1, 1, 1];var n = arr.length;document.write( sumMax(0, arr, n)); </script>
2
 
vt_m
SURENDRA_GANGWAR
itsok
subsequence
Arrays
Dynamic Programming
Recursion
Arrays
Dynamic Programming
Recursion
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Window Sliding Technique
Trapping Rain Water
Building Heap from Array
Program to find sum of elements in a given array
Reversal algorithm for array rotation
0-1 Knapsack Problem | DP-10
Program for Fibonacci numbers
Bellman–Ford Algorithm | DP-23
Longest Common Subsequence | DP-4
Floyd Warshall Algorithm | DP-16