added ex4
This commit is contained in:
parent
3c100a08fe
commit
68ccc3c183
@ -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
42
src/Ex4.py
Normal 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, 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)
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user