added ex4

This commit is contained in:
Louis Heredero 2025-01-28 15:20:24 +01:00
parent 3c100a08fe
commit 68ccc3c183
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
3 changed files with 57 additions and 1 deletions

View File

@ -2,6 +2,7 @@
"""
Nom/Prénom: Heredero/Louis
Explications:
Tout d'abord, le réseau de routes et d'intersections peut être représenté par un graphe,
dans lequel les interséctions sont les nœuds et les routes les arêtes.

42
src/Ex4.py Normal file
View File

@ -0,0 +1,42 @@
"""
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, 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)

View File

@ -1,8 +1,21 @@
import unittest
from Ex4 import computeNbrOfDifferentSequences
class MyTestCase(unittest.TestCase):
def test_simple1(self):
pass
self.assertEqual(
computeNbrOfDifferentSequences(1, 6, 3),
1
)
def test_simple2(self):
self.assertEqual(
computeNbrOfDifferentSequences(2, 6, 7),
6
)
if __name__ == '__main__':
unittest.main()