最大不相邻元素和

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)  

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;
    }

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值