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