数组中的最大总和,使得可以在 5 个元素中选择最多 2 个连续的元素

Posted

技术标签:

【中文标题】数组中的最大总和,使得可以在 5 个元素中选择最多 2 个连续的元素【英文标题】:Maximum sum in array such that atmost 2 consecutive in 5 elements can be selected 【发布时间】:2018-01-03 22:53:17 【问题描述】:

我无法解决如何选择元素。

例如,如果我们有 1,2,3,4,5,6,7,8,9,10

我们选择 4,5

那么我们不能选择 6,7,8 但我们可以选择 9th

所以,我猜一般

如果我们选择2个连续元素arr[i]和arr[i+1]

然后我们不能选择从接下来的 3 个值 arr[i+2]、arr[i+3]、arr[i+4] 中我们只能选择来自 arr[i+5]

例如:

考虑这个具有 9 个元素的数组

输入:arr[] = 100, 200, 100, 500, 900, 500, 300, 400, 100

输出:1500

最大总和应为:1500

取第 4、5、9 位的值得到

即 500+900+100 = 1500

另一个例子:

考虑这个具有 10 个元素的数组

输入:arr[] = 500, 700, 300, 500, 900, 700, 600, 400, 700, 500

输出:2800

选择 (2, 5, 9, 10) 处的元素

即 700+900+700+500 = 2800

【问题讨论】:

为什么不是 500 + 900 + 500? 还是 500 + 900 + 400?我不太明白这个问题。 我们不能在第一个例子中取(500+900+500),因为会有3个连续的选择,我们可以有ATMOST 2个连续的选择。​​ 是每五人一组连续两个还是任何五人一组中的两个? 如果我选择不连续的数字呢?例如:我选择索引 0、2、4、6、8 处的所有数字...有效吗? 【参考方案1】:

对我来说,这可以通过对动态规划算法的简单修改来完成。实际上,您可以添加一个变量来指示是否选择了最后一个元素。假设您正在考虑位置 idx 的元素,您需要一个变量来告诉您是否选择了 idx - 1:(1)如果不是,您还没有选择任何连续的,您可以继续idx + 1, (2) 如果是,则应从 idx + 4 开始,因为 idx+1, idx+2, idx+3 不允许再选择了。

这是 C++ 中的一个实现:

    const int n = 1000;

    int arr[n];


    int dp[n][2];
    bool mark[n][2];

    int rec(int idx, bool idx_minus1_picked)
        if(idx >= n)
            return 0; // we have reached end of array
        

        if(mark[idx][lidx_minus1_picked])
            return dp[idx][idx_minus1_picked];
        

        int &ret = dp[idx][idx_minus1_picked];
        ret = 0;

        if(idx_minus1_picked)
            //get the maximum between picking or not picking arr[idx]
            ret = max(arr[idx] + rec(idx + 4, false), rec(idx + 1, false));
        
        else
            ret = max(arr[idx] + rec(idx + 1, true), rec(idx + 1, false));
        

        return ret;

    

int main()
    int answer = rec(0, false);
    return 0;

【讨论】:

以上是关于数组中的最大总和,使得可以在 5 个元素中选择最多 2 个连续的元素的主要内容,如果未能解决你的问题,请参考以下文章

将数组划分为 k 个连续分区,使得最大分区的总和最小

多重分配/矩阵最大化

求数组中 n 个元素的最大和,使得相邻的元素不超过 k 个

最大化所有可能子数组的特定总和

java中数组最多可以放置多少个元素?

最多具有K个元素的最大连续子数组