数组中的最大总和,使得可以在 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 个连续的元素的主要内容,如果未能解决你的问题,请参考以下文章