""" 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)