En fait, il n'est pas nécessaire de commencer de bas en haut ; vous pouvez tout aussi bien commencer de haut en bas, à condition de le faire correctement.
La façon dont il fonctionne de bas en haut est mieux illustrée en prenant ce qui se passe à chaque niveau de la pyramide. Le chemin doit sûrement traverser chaque niveau à un moment donné.
x
x x
x h x
x y y x
x y y y x
Disons que c'est h
. D'après la définition des chemins admissibles, le chemin ne peut que descendre dans le y
-Ce problème est similaire à celui de l'original : si nous trouvons un chemin maximal à travers les endroits marqués, nous pouvons trouver un chemin qui ne soit pas trop long. y
et le chemin maximal de tout le triangle passe en fait par h
il suivra sûrement un chemin maximal dans y
(si ce n'est pas le cas, vous pouvez échanger la partie du chemin dans le plus petit triangle et obtenir un meilleur chemin global).
Ainsi, si vous structurez votre algorithme de haut en bas en calculant le chemin maximal à partir du nœud actuel vers le bas, vous obtenez le résultat correct (c'est-à-dire la valeur du chemin maximal, à partir de laquelle vous pouvez facilement obtenir le chemin lui-même).
Cela prend O(N) (N étant le nombre de chiffres), car pour chaque endroit, il suffit de considérer deux chemins et d'utiliser les valeurs précalculées du niveau inférieur.
Pratiquement le même algorithme peut être mis en œuvre de manière descendante, en commençant par le haut et en effectuant une récursion vers le bas, à condition de mémoriser le résultat.
best_length(node)
{
if(node is terminal)
return value(node)
int m = 0
for(next : lower neighbors of node)
m = max(best_length(next), m)
return m + value(node);
}
Une autre possibilité de faire cela de haut en bas serait d'inverser le calcul. On commence par le haut, pour chaque nœud en considérant ses voisins supérieurs, et on obtient la longueur du chemin du haut se terminant dans ce nœud (au lieu du chemin allant de ce nœud vers la rangée du bas). À la fin, vous rassemblez les données de la rangée inférieure et vous avez terminé.
0 votes
Lorsque deux problèmes d'Euler sont connectés, il y a toujours une façon intelligente de le résoudre. Respectez toujours la question, respectez toujours le temps imparti. Dans ce cas, la question porte sur le CHEMIN MAXIMAL et non sur le chemin lui-même.
0 votes
Que voulez-vous dire par "Quand deux problèmes d'Euler sont connectés" ? Quel est l'autre problème ici ? Aussi, comment puis-je trouver le chemin maximum, si je ne sais pas ce qui forme le chemin maximum ? c'est-à-dire comment faire le parcours pour trouver la valeur du chemin maximum ?
1 votes
Dans la NOTE du problème 18, le problème 67 est spécifié comme un problème connecté (18, 67, 81, 82 et 83 sont différentes variations du même problème. La résolution du problème 83 fournira la méthode pour résoudre les autres).
MAXIMUM PATH
est un très, très bon indice dans ce cas. Amusez-vous bien à résoudre les problèmes.2 votes
Cet exemple est trompeur, j'ai d'abord pensé à aller de haut en bas en choisissant la valeur maximale de l'enfant à chaque étape.
0 votes
Lorsque j'ajoute à partir du haut, j'obtiens 25 comme nombre le plus élevé. 3 + 7 = 10. Puis la rangée suivante 10 + 6 = 16. Puis, à partir de cette rangée, 16 + 9 = 25. C'est un problème difficile. Cet article est utile mais je suis toujours un peu perdu pour le résoudre.