Das ist das Problem: Geben Sie für eine Anzahl von Ziegeln n zwischen 3 und 200 die Anzahl der verschiedenen Treppen, die gebaut werden können, zurück. Jede Art von Treppe sollte aus 2 oder mehr Stufen bestehen. Keine zwei Schritte dürfen auf gleicher Höhe sein - jeder Schritt muss niedriger sein als der vorherige. Alle Schritte müssen mindestens einen Baustein enthalten. Die Höhe eines Schrittes wird als die Gesamtmenge der Steine, die diesen Schritt ausmachen, klassifiziert.Erklärung der dynamischen Programmierlösung
Zum Beispiel, wenn N = 3, haben Sie nur 1 Wahl, wie man die Treppe baut, wobei der erste Schritt eine Höhe von 2 hat und der zweite Schritt eine Höhe von 1: (# bedeutet Ziegel)
#
##
21
wenn N = 4, haben Sie immer noch nur 1 Treppe Wahl:
#
#
##
31
Aber wenn N = 5 gibt zwei Möglichkeiten, können Sie eine Treppe aus den gegebenen Ziegeln bauen. Die beiden Treppen können Höhen haben (4, 1) oder (3, 2), wie unten dargestellt:
#
#
#
##
41
#
##
##
32
ich eine Lösung gefunden online, aber ich weiß nicht ganz intuitiv die dynamische Programmierlösung verstehen.
public class Answer {
static int[][] p = new int[201][201];
public static void fillP() {
p[1][1] = 1;
p[2][2] = 1;
for (int w = 3; w < 201 ; w++) {
for (int m = 1; m <= w; m++) {
if (w-m == 0) {
p[w][m] = 1 + p[w][m-1];
} else if (w-m < m) {
p[w][m] = p[w-m][w-m] + p[w][m-1];
} else if (w-m == m) {
p[w][m] = p[m][m-1] + p[w][m-1];
} else if (w-m >m) {
p[w][m] = p[w-m][m-1] + p[w][m-1];
}
}
}
}
public static int answer(int n) {
fillP();
return p[n][n] - 1;
}
}
Insbesondere, wie würde man die Beziehungen zwischen jedem aufeinanderfolgenden Eintrag im Array kommen?
Dank! :) Es ist eine lustige Herausforderung! –