C'est le problème: avec un nombre de briques n compris entre 3 et 200, renvoyer le nombre d'escaliers différents qui peuvent être construits. Chaque type d'escalier doit comporter deux étapes ou plus. Aucune étape ne doit être à la même hauteur - chaque étape doit être inférieure à la précédente. Toutes les étapes doivent contenir au moins une brique. La hauteur d'une marche est classée comme la quantité totale de briques qui composent cette marche. Par exemple, lorsque N = 3, vous avez seulement 1 choix de la façon de construire l'escalier, avec la première étape ayant une hauteur de 2 et la seconde étape ayant une hauteur de 1: (# indique une brique)Explication de la solution de programmation dynamique
#
##
21
lorsque N = 4, vous encore que 1 ont le choix d'escalier:
#
#
##
31
Mais quand N = 5, il y a deux façons dont vous pouvez construire un escalier des briques données. Les deux escaliers peuvent avoir des hauteurs (4, 1) ou (3, 2), comme indiqué ci-dessous:
#
#
#
##
41
#
##
##
32
J'ai trouvé une solution en ligne, mais je ne comprends pas tout à fait intuitivement la solution de programmation dynamique.
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;
}
}
En particulier, comment pourrait-on trouver les relations entre chaque entrée successive dans le tableau?
Merci! :) C'est un challenge amusant! –