Somme maximale des éléments non consécutifs (programmation dynamique)
Étant donné un tableau d'entiers positifs, quel est l'algorithme le plus efficace pour trouver des éléments non consécutifs de ce tableau qui, lorsqu'ils sont additionnés, produisent la somme maximale?
La solution de programmation dynamique consiste à utiliser un tableau auxiliaire maxSum
contenant la somme maximale jusqu'à cet index particulier. Nous commençons par définir les 2 premiers indices du tableau et remplissons le reste du tableau avec max(array[i]+maxSum[i-2], maxSum[i-1])
.
Je comprends que nous ne pouvons pas ajouter d'éléments adjacents, mais j'ai du mal à comprendre comment la solution ci-dessus prend en considération le fait qu'il est possible que l'élément précédent maxSum[i]
ne soit pas le résultat d'une sommation avec array[i]
.
Par exemple:
index: 0 1 2 3 4
array: 3 5 -7 8 10
maxSum: 3 5 5 _
Nous voyons que maxSum [2] n'est pas le résultat d'une sommation avec le tableau [2].
A trouver maxSum[3] = max(array[3]+maxSum[1], maxSum[2])
, mais pourquoi ne pas envisager maxSum[2] + array[3]
? Puisqu'il est possible que maxSum [2] ne soit pas constitué de la valeur du tableau adjacent [2].
Comment la solution ci-dessus prend-elle en considération le fait qu'il est possible que l'élément précédent dans maxSum [i] ne soit pas le résultat de la somme avec le tableau [i]?
Simplement. Si l'élément précédent dans maxSum [i] ne doit pas être inclus dans le résultat de la somme avec le tableau [i], nous pouvons regarder maxSum [i - 2]. Nous faisons cela explicitement dans
array[i]+maxSum[i-2]
nous comparons cela à l'option de ne pas inclure le tableau [i], qui est
maxSum[i-1]