2025-01-28 15:20:24 +01:00

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)