Я пытаюсь найти подпоследовательность максимального веса массива натуральных чисел - суть в том, что в конечной подпоследовательности нельзя использовать соседние элементы., и MarkusQ дал рекурсивное решение таким образом:
function Max_route(A)
if A's length = 1
A[0]
else
maximum of
A[0]+Max_route(A[2...])
Max_route[1...]
Он дает объяснение, но может ли кто-нибудь помочь мне понять, как он расширил функцию?В частности, что он имеет в виду под
f[] :- [],0
f [x] :- [x],x
f [a,b] :- if a > b then [a],a else [b],b
f [a,b,t] :-
ft = f t
fbt = f [b|t]
if a + ft.sum > fbt.sum
[a|ft.path],a+ft.sum
else
fbt
Почему он расширяется f[]
до [],0
?Кроме того, как его решение учитывает несмежных членов?
У меня есть некоторый код C ++, основанный на этом алгоритме, который я могу опубликовать, если кто-то захочет его увидеть, но я просто не могу понять, почему он работает.
========== Для всех, кому интересно, - код C ++ ==============
Я должен добавить, что массив целых чиселследует рассматривать как циклический список, поэтому любая последовательность, содержащая первый элемент, не может содержать последний.
int memo[55][55];
int solve(int s, int e)
{
if( s>e ) return 0;
int &ret=memo[s][e];
if(ret!=-1)
{
return ret;
}
ret=max(solve(s+1,e), solve(s+2,e)+a[s]);
return ret;
}
class Sequence
{
public:
int maxSequence(vector <int> s)
{
memset(memo,-1);
int n = s.size();
for(int i=0; i<n; i++)
a[i]=s[i];
return max(solve(0,n-2),solve(1,n-1));
}
};