至于建议,这是一个动态的规划问题。
首先,一些符号,设:
A
是数组,整数,长度N
A[a..b)
的是含有在索引a
元素多达 但不包括b
A
所述子集(半开间隔)。
M
是一个数组,使得M[k]
是A[0..k)
的具体最大总和,使得M[N]
是我们原始问题的答案。
我们可以通过其关系描述的M
(M[n]
)的元素,以其中的k < n
M
(M[k]
)一种或多种元素。这适用于一个很好的线性时间算法。那么这种关系是什么?
所以关系变成:
M[0] = 0
M[1] = A[0]
M[2] = max {A[0], A[1]}
M[n] = max {M[n-1], M[n-3] + A[n-1]} where n > 2
注意很多答案似乎忽略了空单的情况下,却是 绝对是一个有效的输入,所以应占对于。
在C++解决方案的简单翻译如下:
(需要特别注意的一个事实,即m
的大小比a
大小一个更大)
int max_specific_sum(std::vector<int> a)
{
std::vector<int> m(a.size() + 1);
m[0] = 0; m[1] = a[0]; m[2] = std::max(a[0], a[1]);
for(unsigned int i = 3; i <= a.size(); ++i)
m[i] = std::max(m[i-1], m[i-3] + a[i-1]);
return m.back();
}
但是该实现具有线性空间要求的大小为A
。如果你看看M[n]
的定义,你会看到,它仅依靠M[n-1]
和M[n-3]
(和前面的元素列表全没有),这意味着你只需要存储以前的3种元素在M
,导致恒定空间要求。 (这个实现的细节留给OP)。
你的算法是什么? –
...并且代码 –
在哪里我也很困惑。数组只有一个和,所以max = min = sum? –