最大不相邻元素和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tianweidadada/article/details/82107850

Maximum sum in circular array such that no two elements are adjacent

Given a circular array containing of positive integers value. The task is to find the maximum sum of a subsequence with the constraint that no 2 numbers in the sequence should be adjacent in the array.

Examples:

Input: circular arr = {1, 2, 3, 1}
Output : 4
subsequence will be(1, 3), hence 1 + 3 = 4 

Input: circular arr = {1, 2, 3, 4, 5, 1}
Output: 9
subsequence will be(1, 3, 5), hence 1 + 3 = 4 

思路:题目难点在于是环形的数组,可以考虑,第一个元素与最后一个元素,这两个不能相邻,

对于这两个元素是否在最终求和的集合中的可能情况:

1都存在:不可能

2第一个元素存在

3第二个元素存在

4都不存在

其中 4 可包含在 2、3的情况之中

所以可以把环形数组 分成两个线性数组 然后 分别求得最大不相邻和,取最大的即为结果。

arr1 : 0 到 n-2 (0-indexed)  

扫描二维码关注公众号,回复: 3317092 查看本文章

arr2 : 1 到 n-1  (0-indexed)

code:

#include<bits/stdc++.h>
using namespace std;

int maxSum1(int arr[], int n){
    int dp[n];
    for(int i = 0; i < n-1; ++i)
        dp[i] = arr[i];
    int mmax = dp[0];
    // dp[i] 表示 包含 i-th元素 最大不相邻和
    for(int i = 2; i < n-1; ++i){
        for(int j = 0; j < i-1; ++j){
            if(dp[i] < dp[j] + arr[i]){
                dp[i] = dp[j] + arr[i];
            }
        }
        mmax = max(mmax,dp[i]);  // 包含 此次没有更新 dp[i] 的情况
    }
    return mmax;
}

int maxSum2(int arr[], int n){
    int dp[n];
    for(int i = 1; i < n; ++i)
        dp[i] = arr[i];
    int mmax = dp[1];
    for(int i = 3; i < n; ++i){
        for(int j = 1; j < i-1; ++j){
            if(dp[i] < dp[j] + arr[i]){
                dp[i] = dp[j] + arr[i];
            }
        }
        mmax = max(mmax,dp[i]);
    }
    return mmax;
}

int findMaxSum(int arr[],int n){
    if(n == 1)  // 一个元素时候 需要单独处理
        return arr[0];
    return max(maxSum1(arr,n),maxSum2(arr,n));
}

int main()
    {

//        int arr[] = { 1, 2, 3, 1 };
        int arr[] = {5};
        int n = sizeof(arr)/sizeof(arr[0]);
        cout << findMaxSum(arr, n);

        return 0;
    }

猜你喜欢

转载自blog.csdn.net/Tianweidadada/article/details/82107850