Question: Given an array all of whose elements are positive numbers, find the maximum sum of a subsequence with the constraint that no 2 numbers in the sequence should be adjacent in the array.
Ex-1: 3 2 7 10 should return 13 (sum of 3 and 10) .
Ex-2: 3 2 5 10 7 should return 15 (sum of 3, 5 and 7).
Algorithm:
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.
Explanation:
And 35 is the last element. So, answer is max(incl, excl) = 80.
C++ Code:
Ex-1: 3 2 7 10 should return 13 (sum of 3 and 10) .
Ex-2: 3 2 5 10 7 should return 15 (sum of 3, 5 and 7).
Algorithm:
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.
Explanation:
arr[] = {5, 5, 10, 40, 50, 35}
inc = 5
exc = 0
For i = 1 (current element is 5)
incl = (excl + arr[i]) = 5
excl = max(5, 0) = 5
For i = 2 (current element is 10)
incl = (excl + arr[i]) = 15
excl = max(5, 5) = 5
For i = 3 (current element is 40)
incl = (excl + arr[i]) = 45
excl = max(5, 15) = 15
For i = 4 (current element is 50)
incl = (excl + arr[i]) = 65
excl = max(45, 15) = 45
For i = 5 (current element is 35)
incl = (excl + arr[i]) = 80
excl = max(5, 15) = 65
And 35 is the last element. So, answer is max(incl, excl) = 80.
C++ Code:
#include <iostream> using namespace std; int FindMax(int a[],int l){ int incl=a[0]; int excl=0; for(int i=1;i<l;i++){ int excl_new=(incl>excl)?incl:excl; incl=excl+a[i]; excl=excl_new; } return (incl>excl)?incl:excl; } int main(){ int a[]={3,2,7,10}; cout<<FindMax(a,4)<<endl; }