43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
|
|
"""
|
|
Nom/Prénom: Heredero/Louis
|
|
Explications:
|
|
|
|
Une approche pour résoudre ce problème grâce à la programmation dynamique consiste
|
|
à se représenter les différentes séquences comme un arbre de décisions, où chaque nœud
|
|
représente une séquence, et chaque arête un coup supplémentaire
|
|
On peut alors parcourir l'arbre en profondeur (DFS) jusqu'à trouver une séquence
|
|
de longueur N et de valeur H (en élaguant les branches dépassant H ou N)
|
|
On peut également mémoiser un certain nombre de valeurs : en effet, pour une même
|
|
combinaison N, C, H, le résultat sera toujours le même. Cela optimise donc grandement
|
|
le calcul récursif puisque cela évite de calculer les états partagés (sous-branches
|
|
identiques)
|
|
"""
|
|
|
|
mem: dict[tuple[int, int, int], int] = {}
|
|
|
|
def computeNbrOfDifferentSequences(N: int, C: int, H: int) -> int:
|
|
if N == 0:
|
|
if H == 0:
|
|
return 1
|
|
return 0
|
|
|
|
if H < 0:
|
|
return 0
|
|
|
|
key: tuple[int, int, int] = (N, C, H)
|
|
if key in mem:
|
|
return mem[key]
|
|
|
|
total: int = 0
|
|
for c in range(1, C + 1):
|
|
total += computeNbrOfDifferentSequences(N - 1, C, H - c)
|
|
|
|
mem[key] = total
|
|
return total
|
|
|
|
|
|
if __name__ == '__main__':
|
|
print(computeNbrOfDifferentSequences(1, 6, 3) == 1)
|
|
print(computeNbrOfDifferentSequences(2, 6, 7) == 6)
|