Okay, hier ist, was der Code macht.
`if (n<0)`
`return 0;`
Wenn nicht genug Schritte übrig sind, dann zähle es nicht. Zum Beispiel, wenn noch zwei Schritte übrig sind, aber der Benutzer versucht drei Schritte zu machen, dann wird dies nicht als mögliche Kombination gezählt.
else if (n==0)
return 1;
Wenn die Anzahl der verbleibenden Schritte der Anzahl der verfügbaren Schritte entspricht, die der Benutzer machen möchte, ist dies eine mögliche Kombination. Also, gib eine 1 zurück, weil dies eine mögliche Kombination ist und zur Gesamtanzahl der gültigen Kombinationen hinzugefügt werden sollte.
else if (map[n]>-1)
return map[n];
Hier kommt der Teil des dynamischen Programmierens. Nehmen wir an, dass alle Werte im Array den Wert -1 hatten. Also, wenn die Zahl größer als -1 ist, wurde sie bereits gelöst, also gib die Gesamtanzahl der Kombinationen aus Schrittnummer n zurück, anstatt sie neu zu lösen.
`map[n] = countDP(n-1, map) + countDP(n-2, map) + countDP(n-3, map);`
return map[n]; }
Schließlich löst dieser Teil den Code. Die Anzahl der möglichen Kombinationen entspricht der Anzahl der möglichen Kombinationen, die der Benutzer erhalten kann, wenn er 1 Schritt macht, plus der Anzahl der möglichen Kombinationen, die der Benutzer erhalten kann, wenn er 2 Schritte macht, plus der Anzahl der möglichen Kombinationen, die der Benutzer erhalten kann, wenn er drei Schritte macht.
Ein Beispiel, nehmen wir an, es gibt 5 Schritte
Ein einfacher Durchlauf könnte so aussehen:
//Die Anzahl der Lösungen vom fünften Schritt
countDp(5) = countDp(4)+countDp(3)+countDp(2);
//Anzahl der Lösungen vom vierten Schritt
countDP(4) = countDp(3)+countDp(2)+countDp(1);
//Anzahl der Lösungen vom dritten Schritt
countDp(3) = countDp(2)+countDp(1)+countDp(0);
//Anzahl der Lösungen vom zweiten Schritt
countDp(2) = countDp(1)+countDp(0)+countDp(-1);
//Anzahl der Lösungen vom ersten Schritt
countDp(1) = countDp(0) + countDp(-1)+countDp(-2);
//Schließlich der Basisfall
countDp(0) = 1;
countDp(-1)= 0;
countDp(-2)= 0;
countDp(1) = 1+0+0 = 1;
countDp(2) = 1+1+0 = 2; //Dynamische Programmierung: musste countDp(1) nicht neu berechnen, sondern schaute den Wert in map[1] nach
countDp(3) = 2+1+1 = 4; //Dynamische Programmierung, musste nicht countDp(1), countDp(2) neu lösen, sondern schaute den Wert in map[1] und map[2] nach
countDp(4) = 4+2+1=7 //Dynamische Programmierung, musste nicht CountDp(3),CountDp(2), CountDp(1) neu lösen, sondern schaute sie in map[3], map[2], map[1] nach
countDp(5)= 2+4+7=13 //Dynamische Programmierung, benutzte einfach map[4]+map[3]+map[2]