根据规则寻找最大和
Finding max sum according to rule
我必须根据规则找到整数数组中元素的最大总和:
如果将第二个(或任何连续的)元素添加到总和中 - 仅添加一半的值。为避免这种情况,您可以跳过一个元素。
例如我们有这样的输入 [4, 2, 5, 1, 5]
结果应该是 14。在这种情况下,我们取了 0、2 和 4 位置的元素(4 + 5 + 5 = 14),并跳过了位置 1 和 3 的元素
另一个例子是输入 [3, 1, 10, 6, 3, 10]
在这种情况下,答案应该是 26。我们取了位置 0、2、3、5 的元素,并跳过了位置 1 和 4 的元素。因此总和计算为:
3 + 0 + 10 + 6/2 + 0 + 10 = 26
谁能给我解释一下解决这个问题的算法?或者至少是我应该尝试解决它的方向。这个任务与动态规划有什么关系吗?或者可能使用递归?
提前致谢
一个简单的最佳解决方案是迭代计算两个总和,两者都对应于当前索引 i
的最大值,
假定当前值 arr[i] 未被使用的第一个总和 (sum0),假定当前值 arr[i] 被使用的第二个总和 (sum1)。
sum0_new = max (sum0, sum1);
sum1_new = max (sum0 + x, sum1 + x/2);
复杂度: O(N)
代码:
这是用于说明算法的简单 C++ 代码。
此实现假定整数除法 par 2。如果不是这种情况,则易于修改。
输出:14 26
#include <iostream>
#include <vector>
#include <algorithm>
int max_sum (const std::vector<int>& arr) {
int sum0 = 0;
int sum1 = 0;
for (int x: arr) {
int temp = sum0;
sum0 = std::max (sum0, sum1);
sum1 = std::max (temp + x, sum1 + x/2);
}
return std::max (sum0, sum1);
}
int main() {
std::vector<std::vector<int>> examples = {
{4, 2, 5, 1, 5},
{3, 1, 10, 6, 3, 10}
};
for (std::vector<int>& arr: examples) {
int sum = max_sum (arr);
std::cout << sum << '\n';
}
return 0;
}
我必须根据规则找到整数数组中元素的最大总和:
如果将第二个(或任何连续的)元素添加到总和中 - 仅添加一半的值。为避免这种情况,您可以跳过一个元素。
例如我们有这样的输入 [4, 2, 5, 1, 5] 结果应该是 14。在这种情况下,我们取了 0、2 和 4 位置的元素(4 + 5 + 5 = 14),并跳过了位置 1 和 3 的元素
另一个例子是输入 [3, 1, 10, 6, 3, 10] 在这种情况下,答案应该是 26。我们取了位置 0、2、3、5 的元素,并跳过了位置 1 和 4 的元素。因此总和计算为:
3 + 0 + 10 + 6/2 + 0 + 10 = 26
谁能给我解释一下解决这个问题的算法?或者至少是我应该尝试解决它的方向。这个任务与动态规划有什么关系吗?或者可能使用递归?
提前致谢
一个简单的最佳解决方案是迭代计算两个总和,两者都对应于当前索引 i
的最大值,
假定当前值 arr[i] 未被使用的第一个总和 (sum0),假定当前值 arr[i] 被使用的第二个总和 (sum1)。
sum0_new = max (sum0, sum1);
sum1_new = max (sum0 + x, sum1 + x/2);
复杂度: O(N)
代码:
这是用于说明算法的简单 C++ 代码。
此实现假定整数除法 par 2。如果不是这种情况,则易于修改。
输出:14 26
#include <iostream>
#include <vector>
#include <algorithm>
int max_sum (const std::vector<int>& arr) {
int sum0 = 0;
int sum1 = 0;
for (int x: arr) {
int temp = sum0;
sum0 = std::max (sum0, sum1);
sum1 = std::max (temp + x, sum1 + x/2);
}
return std::max (sum0, sum1);
}
int main() {
std::vector<std::vector<int>> examples = {
{4, 2, 5, 1, 5},
{3, 1, 10, 6, 3, 10}
};
for (std::vector<int>& arr: examples) {
int sum = max_sum (arr);
std::cout << sum << '\n';
}
return 0;
}