2012-12-08 3 views
2

Je suis venu avec la solution récursive simple suivante pour la plus longue sous-séquence croissante. Mais, Pouvez-vous aider à inclure memoization dans cette solution récursive.memoization pour la sous-séquence croissante la plus longue récursive

public int findLIS(int a[], int maxSoFar, int item, int count) { 

     if(item == a.length) { 
      return count; 
     } 
     int length1 = findLIS(a,maxSoFar, item+1, count); 
     int length2 = 0; 
     if(a[item] > maxSoFar) { 

      length2 = findLIS(a, a[item], item+1, count + 1); 
     } 
     return Math.max(length1, length2); 
} 

PS: Ce n'est pas une question de devoirs, c'est plus de mon intérêt.

+0

Quelle langue est-ce? – irrelephant

+0

Java, mais vous pouvez facilement convertir dans votre langue préférée. Je peux le faire pour vous si vous voulez – coder000001

Répondre

3

Utilisez un Map<Pair<Integer,Integer>,Integer> et au début de la méthode ajouter:

Integer cache = map.get(new Pair<Integer,Integer>(maxSoFar,item)); 
if (cache != null) return cache; 

Chaque fois que vous return quoi que ce soit - assurez-vous d'écrire (maxSoFar,item)=returnValue à la carte.

L'idée est de mapper entre la paire qui représente où vous êtes dans le calcul - à la valeur maximale trouvée pour cet état, pour éviter de le recalculer.


Il semble java, vous pouvez utiliser apache commons Pair comme interface Pair.

+0

Merci. Avant de poster ici, j'ai rapidement vérifié avec un tableau de {10, 22, 9, 33, 21, 50, 41, 60, 80}; et un mémo = new int [10] [81]; Mais, ça n'a pas marché pour moi. Je vais vérifier avec votre solution aussi. – coder000001

+2

@ coder000001: Il est équivalent à la solution cartographique. S'il vous plaît poster le code que vous avez utilisé, il pourrait y avoir un bug – amit

+0

Merci, cela fonctionne. – coder000001

Questions connexes