Java - somme Maximale dans le chemin d'accès par le biais d'un tableau 2D
Fondamentalement, j'ai un problème qui va quelque chose de similaire à ceci:
Il y a un jardin de plants de fraises représenté par un 2D, matrice carrée. Chaque plante(chaque élément) a un certain nombre de fraises. Vous commencez dans le coin supérieur gauche de la matrice, et vous ne pouvez déplacer vers la droite ou vers le bas. J'ai besoin de concevoir une méthode récursive pour calculer les chemins à travers le jardin, et puis la sortie que l'on donne de la plupart des fraises.
Je pense que j'ai une compréhension de vraiment vraiment simple les problèmes de la récursivité, mais ce problème a disparu moyen-dessus de ma tête. Je ne suis pas vraiment sûr où commencer ni où aller aussi loin que la création d'une méthode récursive.
Toute aide relative au code ou de m'aider à comprendre le concept derrière ce problème est grandement apprécié. Merci.
oui, il doit être récursive.
Eh bien, dasblinkenlight réponse fonctionne bien, vous avez juste à aussi garder une trace de savoir si aller vers le bas ou la droite donne le plus grand nombre.
OriginalL'auteur user1547050 | 2012-07-23
Vous devez vous connecter pour publier un commentaire.
Comme dasblinkenlight dit, le moyen le plus efficace pour ce faire est d'utiliser un memoization ou de la programmation dynamique technique. J'ai tendance à préférer la programmation dynamique, mais je vais l'utiliser pur récursion.
La réponse tourne autour de la réponse à une question fondamentale: "Si je suis dans la place dans la rangée r et de la colonne c sur mon domaine, comment puis-je évaluer le chemin à partir du haut à gauche pour arriver ici, tels que le nombre de fraises est agrandie?"
La clé pour comprendre, c'est qu'il y a seulement deux façons de faire dans la parcelle de terrain dans la ligne r et de la colonne c: je peux y accéder à partir de ci-dessus, à l'aide de la parcelle de terrain dans la ligne r-1 et à la colonne c, ou je peux y arriver par le côté, à l'aide de la parcelle de terrain dans la ligne r et de la colonne c-1. Après cela, vous devez simplement vous assurer de bien connaître votre base de cas...ce qui signifie, fondamentalement, ma purement récursive version serait quelque chose comme:
Appel max(r-1, c-1) pour obtenir une réponse. Notez qu'il y a beaucoup d'inefficacité ici; vous allez faire beaucoup mieux en utilisant la programmation dynamique (que je vais donner ci-dessous) ou memoization (qui a déjà été défini). La chose à retenir, cependant, est que le DP et memoization techniques sont simplement des moyens plus efficaces qui viennent de l'récursive principes utilisés ici.
DP:
Dans les deux cas, si vous souhaitez recréer le chemin réel, il suffit de garder un 2D tableau de booléens correspondant à "N'ai-je venir d'en haut ou à gauche"? Si la plupart des fraises chemin vient d'en haut, mettez vrai, autrement dit de faux. Qui peut vous permettre de retracer le patch après le calcul.
Avis que c'est tout de même récursive en principe: à chaque étape, nous sommes à la recherche de retour à nos résultats précédents. Nous venons d'arriver à être mise en cache de nos résultats précédents, afin de ne pas gaspiller un tas de travail, et nous attaquons la sous-problèmes dans un système intelligent de commande afin que nous puissions toujours les résoudre. Pour en savoir plus sur la programmation dynamique, voir Wikipédia.
return maxValues[r-1][c-1];
Oups, merci!
Salut DivineWolfwood, votre exemple est très interessant. Mais, qu'est-ce que je tiens à regarder à la fois à gauche et à droite?
Dites-vous que vous pouvez aller soit à gauche ou à droite ou vers le bas à chaque étape? C'est complètement différent de ce problème, car il vous permet de répéter les étapes dans des lieux..j'aurais du penser à travers un algorithme pour que.
La Programmation Dynamique est une approche qui fonctionne très bien, merci!
OriginalL'auteur DivineWolfwood
Vous pouvez le faire en utilisant memoization. Voici Java-comme pseudodoce (
memo
,R
, etC
sont supposés être les variables d'instance à la disposition dumax
méthode).OriginalL'auteur dasblinkenlight
Vous pouvez résoudre ce problème avec DP tabulation méthode, avec lequel vous pouvez économiser de l'espace de O(m*n) à O(n). Avec DP Mémorisation, vous devez m*n de la matrice de stocker des valeurs intermédiaires. Voici mon code Python. J'espère que ça peut aider.
OriginalL'auteur Jonathon.lau