diff --git a/_sources/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb b/_sources/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb index 960af842..19fffd5c 100644 --- a/_sources/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb +++ b/_sources/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb @@ -27,6 +27,21 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "$$\\binom{0}{k} = 0$$\n", + "$$\\binom{n}{0} = 1, \\text{si } n \\neq 0$$\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -36,6 +51,28 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 1, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def binom_rec(n, k): # voir cours\n", + " if k == 0:\n", + " return 1\n", + " if n == 0:\n", + " return 0\n", + " return binom_rec(n - 1, k - 1) + binom_rec(n - 1, k)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -82,6 +119,31 @@ " return ..." ] }, + { + "cell_type": "markdown", + "execution_count": 4, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def binom_dp(n, k):\n", + " M = [[0]*(k + 1) for _ in range(n + 1)]\n", + " for i in range(0, n + 1):\n", + " M[i][0] = 1 # cas de base\n", + "\n", + " for i in range(1, n + 1):\n", + " for j in range(1, k + 1):\n", + " M[i][j] = M[i - 1][j - 1] + M[i - 1][j]\n", + " return M[n][k]\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 5, @@ -125,6 +187,31 @@ " return aux(n, k)" ] }, + { + "cell_type": "markdown", + "execution_count": null, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def binom(n, k):\n", + " d = {}\n", + " def aux(i, j):\n", + " if j == 0: return 1\n", + " if i == 0: return 0\n", + " if (i, j) not in d:\n", + " d[(i, j)] = aux(i - 1, j - 1) + aux(i - 1, j)\n", + " return d[(i, j)]\n", + " return aux(n, k)\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -154,6 +241,27 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "Si $a_k$ est utilisée : il faut encore rendre $n - a_k$ euros avec les pièces $a_1$, ..., $a_k$ (on a le droit d'utiliser plusieurs fois $a_k$), d'où $r(n, k) = r(n - a_k, k) + 1$.\n", + "\n", + "Dans le cas général, on considère les deux possibilités et on conserve le minimum : \n", + "$$\n", + " r(n, k) = min(r(n, k - 1), r(n - a_k, k) + 1)\n", + "$$\n", + "\n", + "Remarque : on ne peut utiliser $a_k$ pour rendre $n$ euros que si $n \\geq a_k$. Si $n < a_k$, on a donc $r(n, k) = r(n, k - 1)$.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -164,6 +272,33 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 1, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def rendu(L, n):\n", + " k = len(L) # nombre de pièces\n", + " M = [[0]*(k + 1) for _ in range(n + 1)]\n", + " for i in range(1, n + 1):\n", + " M[i][0] = float(\"inf\")\n", + " for j in range(1, k + 1):\n", + " if i - L[j - 1] >= 0:\n", + " M[i][j] = min(M[i][j - 1], 1 + M[i - L[j - 1]][j])\n", + " else:\n", + " M[i][j] = M[i][j - 1]\n", + " return M[-1][-1]\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 8, @@ -193,6 +328,43 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 9, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def rendu_memo(L, n):\n", + " k = len(L)\n", + " d = {}\n", + " def aux(i, j):\n", + " if (i, j) in d:\n", + " return d[(i, j)]\n", + " if i == 0:\n", + " return 0\n", + " if j == 0:\n", + " return float(\"inf\")\n", + " if i - L[j - 1] >= 0:\n", + " d[(i, j)] = min(aux(i, j - 1), 1 + aux(i - L[j - 1], j))\n", + " else:\n", + " d[(i, j)] = aux(i, j - 1)\n", + " return d[(i, j)]\n", + " return aux(n, k)\n", + "rendu_memo([1, 2, 5], 7)\n", + "```\n", + "``` \n", + "2\n", + "\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -223,6 +395,23 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 5, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "M = [[1, 0, 0, 0], [0, 0, 1, 1], [0, 1, 1, 1], [0, 1, 0, 1]]\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -239,6 +428,28 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 6, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def est_carre(M, x, y, k):\n", + " for i in range(x, x + k):\n", + " for j in range(y, y + k):\n", + " if M[i][j] != 1:\n", + " return False\n", + " return True\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 11, @@ -257,6 +468,29 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 9, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def contient_carre(M, k):\n", + " n = len(M)\n", + " for i in range(n - k + 1):\n", + " for j in range(n - k + 1):\n", + " if est_carre(M, i, j, k):\n", + " return True\n", + " return False\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 12, @@ -275,6 +509,28 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 13, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def max_carre1(M):\n", + " n = len(M)\n", + " for k in range(n, 0, -1):\n", + " if contient_carre(M, k):\n", + " return k\n", + " return 0\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -304,6 +560,22 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "- `est_carre(M, x, y, k)` est en $O(k^2)$. \n", + "- `contient_carre(M, k)` appelle O($n$) fois `est_carre`, donc est en $O(n^2 k^2)$. \n", + "- `max_carre1(M)` appelle `contient_carre` pour $k = 1, 2, ..., n$, donc est de complexité $\\sum_{k=1}^n O(n^2 k^2) = O(n^3 \\sum_{k=1}^n k^2)$. Comme $\\sum_{k=1}^n k^2 = \\frac{n(n+1)(2n+1)}{6} = O(n^3)$, la complexité totale est $\\boxed{O(n^6)}$.`\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -321,6 +593,22 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "`c[0][y] = 0` si `m[0][y] = 0` et `c[0][y] = 1` sinon. \n", + "De même pour `c[x][0]`. \n", + "Remarque : `c[0][y]` et `c[x][0]` sont donc les mêmes valeurs que `m[0][y]` et `m[x][0]`, on peut donc initialiser `c` comme une copie de `m`.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -330,6 +618,20 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "`c[x][y] = 0`.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -348,6 +650,29 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 15, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def max_carre2(m):\n", + " c = m.copy()\n", + " for i in range(len(m)):\n", + " for j in range(len(m[0])):\n", + " if m[i][j] == 1:\n", + " c[i][j] = 1 + min(c[i - 1][j], c[i][j - 1], c[i - 1][j - 1])\n", + " return max(max(l) for l in c)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 16, @@ -377,6 +702,21 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "`max_carre2(m)` est en $\\boxed{O(n^2)}$ à cause des deux boucles `for` imbriquées. \n", + "C'est donc beaucoup mieux que `max_carre1(m)` qui est en $O(n^6)$.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/_sources/dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb b/_sources/dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb index ff355c67..339282c8 100644 --- a/_sources/dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb +++ b/_sources/dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb @@ -37,6 +37,35 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": null, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def glouton(c, w, v):\n", + " \"\"\"Renvoie la valeur maximum qu'on peut obtenir avec les objets\n", + " c: capacité du sac\n", + " w: poids des objets\n", + " v: valeur des objets\n", + " \"\"\"\n", + " poids = 0\n", + " valeur = 0\n", + " for i in range(len(w)):\n", + " if poids + w[i] <= c:\n", + " poids += w[i]\n", + " valeur += v[i]\n", + " return valeur\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -73,6 +102,27 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 3, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def combine(L1, L2):\n", + " L = []\n", + " for i in range(len(L1)):\n", + " L.append((L1[i], L2[i]))\n", + " return L\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -102,6 +152,29 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 5, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def split(L):\n", + " L1 = []\n", + " L2 = []\n", + " for i in range(len(L)):\n", + " L1.append(L[i][0])\n", + " L2.append(L[i][1])\n", + " return L1, L2\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -161,6 +234,26 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 8, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def tri_poids(w, v):\n", + " L = combine(w, v)\n", + " L.sort()\n", + " return split(L)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -199,6 +292,25 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 10, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def glouton_poids(c, w, v):\n", + " w, v = tri_poids(w, v)\n", + " return glouton(c, w, v)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 11, @@ -228,6 +340,31 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 12, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def tri_valeur(w, v):\n", + " L = combine(v, w)\n", + " L.sort(reverse=True)\n", + " L1, L2 = split(L)\n", + " return L2, L1\n", + "\n", + "def glouton_valeur(c, w, v):\n", + " w, v = tri_valeur(w, v)\n", + " return glouton(c, w, v)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 13, @@ -257,6 +394,32 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 14, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def tri_ratio(v, w):\n", + " L = combine(v, w)\n", + " L = combine([v[i]/w[i] for i in range(len(v))], L)\n", + "\n", + " L.sort(reverse=True)\n", + " return split(split(L)[1])\n", + "\n", + "def glouton_ratio(c, w, v):\n", + " v, w = tri_ratio(v, w)\n", + " return glouton(c, w, v)\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 15, @@ -299,6 +462,20 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "$dp[i][0] = 0$ : on ne peut pas mettre d'objet dans un sac de capacité $0$.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -308,6 +485,20 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "$dp[i][j] = dp[i][j-1]$ : on ne peut pas mettre l'objet $j$ dans le sac de capacité $i$.\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -317,6 +508,20 @@ "````" ] }, + { + "cell_type": "markdown", + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "$$dp[i][j] = \\max(\\underbrace{dp[i][j - 1]}_{\\text{sans prendre } o_j}, \\underbrace{dp[i - w_j][j - 1] + v_j}_{\\substack{\\text{en prenant } o_j}, \\text{si }i - w_j \\geq 0})$$\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -326,6 +531,32 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 16, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def prog_dyn(c, w, v):\n", + " n = len(w)\n", + " dp = [[0 for j in range(c+1)] for i in range(n+1)]\n", + " for i in range(1, n+1):\n", + " for j in range(1, c+1):\n", + " if j < w[i-1]:\n", + " dp[i][j] = dp[i-1][j]\n", + " else:\n", + " dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1])\n", + " return dp[n][c]\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 17, @@ -363,6 +594,29 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 18, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "import random\n", + "\n", + "def genere_instance():\n", + " c = random.randint(1, 1000)\n", + " w = [random.randint(1, 100) for i in range(100)]\n", + " v = [random.randint(1, 100) for i in range(100)]\n", + " return c, w, v\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -373,6 +627,32 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 19, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "gp, gv, gr = 0, 0, 0\n", + "for i in range(100):\n", + " c, w, v = genere_instance()\n", + " sol = prog_dyn(c, w, v)\n", + " gp += glouton_poids(c, w, v)/sol\n", + " gv += glouton_valeur(c, w, v)/sol\n", + " gr += glouton_ratio(c, w, v)/sol\n", + "print(f\"Glouton poids : {gp/100}\")\n", + "print(f\"Glouton valeur : {gv/100}\")\n", + "print(f\"Glouton ratio : {gr/100}\")\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -382,6 +662,35 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 20, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "import time\n", + "\n", + "t1, t2 = 0, 0\n", + "for i in range(100):\n", + " c, w, v = genere_instance()\n", + " t = time.time()\n", + " glouton_poids(c, w, v)\n", + " t1 += time.time() - t\n", + " t = time.time()\n", + " prog_dyn(c, w, v)\n", + " t2 += time.time() - t\n", + "print(f\"Glouton poids : {t1} s\")\n", + "print(f\"Programmation dynamique : {t2} s\")\n", + "```\n", + "````" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -401,6 +710,43 @@ "````" ] }, + { + "cell_type": "markdown", + "execution_count": 21, + "metadata": { + "tags": [ + "cor" + ] + }, + "source": [ + "````{admonition} Solution\n", + ":class: tip, dropdown\n", + "``` python\n", + "def prog_dyn(c, w, v):\n", + " n = len(w)\n", + " dp = [[0 for j in range(c+1)] for i in range(n+1)]\n", + " for i in range(1, n+1):\n", + " for j in range(1, c+1):\n", + " if j < w[i-1]:\n", + " dp[i][j] = dp[i-1][j]\n", + " else:\n", + " dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1])\n", + "\n", + " # reconstruction de la solution\n", + " i, j = n, c\n", + " sol = []\n", + " while i > 0 and j > 0:\n", + " if dp[i][j] == dp[i-1][j]:\n", + " i -= 1\n", + " else:\n", + " sol.append(i-1)\n", + " j -= w[i-1]\n", + " i -= 1\n", + " return sol\n", + "```\n", + "````" + ] + }, { "cell_type": "code", "execution_count": 22, diff --git a/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.html b/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.html index 7b64f7fe..ee1edf8e 100644 --- a/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.html +++ b/dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.html @@ -624,10 +624,28 @@
Que peut-on prendre comme cas de base ?
+Solution
+Question
Écrire une fonction récursive binom_rec(n, k)
renvoyant \(\binom{n}{k}\) à partir de la formule ci-dessus. Expliquer pourquoi la complexité de cette fonction est très mauvaise.
Solution
+def binom_rec(n, k): # voir cours
+ if k == 0:
+ return 1
+ if n == 0:
+ return 0
+ return binom_rec(n - 1, k - 1) + binom_rec(n - 1, k)
+
Solution
+def binom_dp(n, k):
+ M = [[0]*(k + 1) for _ in range(n + 1)]
+ for i in range(0, n + 1):
+ M[i][0] = 1 # cas de base
+
+ for i in range(1, n + 1):
+ for j in range(1, k + 1):
+ M[i][j] = M[i - 1][j - 1] + M[i - 1][j]
+ return M[n][k]
+
Solution
+def binom(n, k):
+ d = {}
+ def aux(i, j):
+ if j == 0: return 1
+ if i == 0: return 0
+ if (i, j) not in d:
+ d[(i, j)] = aux(i - 1, j - 1) + aux(i - 1, j)
+ return d[(i, j)]
+ return aux(n, k)
+
Solution
+Si \(a_k\) est utilisée : il faut encore rendre \(n - a_k\) euros avec les pièces \(a_1\), …, \(a_k\) (on a le droit d’utiliser plusieurs fois \(a_k\)), d’où \(r(n, k) = r(n - a_k, k) + 1\).
+Dans le cas général, on considère les deux possibilités et on conserve le minimum : +$\( + r(n, k) = min(r(n, k - 1), r(n - a_k, k) + 1) +\)$
+Remarque : on ne peut utiliser \(a_k\) pour rendre \(n\) euros que si \(n \geq a_k\). Si \(n < a_k\), on a donc \(r(n, k) = r(n, k - 1)\).
+Question
En déduire une fonction rendu(L, n)
par programmation dynamique renvoyant le nombre minimum de pièces requises pour rendre n
euros, où L
est la liste des pièces.
On remplira une matrice M
pour que M[i][j]
contienne le nombre minimum de pièces pour rendre i
euros en utilisant les j
premières pièces de L
.
Solution
+def rendu(L, n):
+ k = len(L) # nombre de pièces
+ M = [[0]*(k + 1) for _ in range(n + 1)]
+ for i in range(1, n + 1):
+ M[i][0] = float("inf")
+ for j in range(1, k + 1):
+ if i - L[j - 1] >= 0:
+ M[i][j] = min(M[i][j - 1], 1 + M[i - L[j - 1]][j])
+ else:
+ M[i][j] = M[i][j - 1]
+ return M[-1][-1]
+
rendu([1, 2, 5], 7)
@@ -728,6 +799,32 @@ Rendu de monnaieQuestion
Réécrire la fonction précédente par mémoïsation plutôt que par programmation dynamique.
Solution
+def rendu_memo(L, n):
+ k = len(L)
+ d = {}
+ def aux(i, j):
+ if (i, j) in d:
+ return d[(i, j)]
+ if i == 0:
+ return 0
+ if j == 0:
+ return float("inf")
+ if i - L[j - 1] >= 0:
+ d[(i, j)] = min(aux(i, j - 1), 1 + aux(i - L[j - 1], j))
+ else:
+ d[(i, j)] = aux(i, j - 1)
+ return d[(i, j)]
+ return aux(n, k)
+rendu_memo([1, 2, 5], 7)
+
2
+
+
Définir M
en Python.
Solution
+M = [[1, 0, 0, 0], [0, 0, 1, 1], [0, 1, 1, 1], [0, 1, 0, 1]]
+
Écrire une fonction est_carre
telle que est_carre(m, x, y, k)
détermine si la sous-matrice de m
de taille \(k \times k\) et dont la case en haut à gauche a pour coordonnées (x
, y
) ne possède que des 1.
Solution
+def est_carre(M, x, y, k):
+ for i in range(x, x + k):
+ for j in range(y, y + k):
+ if M[i][j] != 1:
+ return False
+ return True
+
assert(est_carre(M, 1, 2, 2) and not est_carre(M, 1, 1, 2))
@@ -757,6 +871,18 @@ Méthode naïveQuestion
Écrire une fonction contient_carre
telle que contient_carre(m, k)
renvoie true
si m
contient un carré de 1 de taille \(k\), false
sinon.
Solution
+def contient_carre(M, k):
+ n = len(M)
+ for i in range(n - k + 1):
+ for j in range(n - k + 1):
+ if est_carre(M, i, j, k):
+ return True
+ return False
+
assert(contient_carre(M, 2) and not contient_carre(M, 3))
@@ -768,6 +894,17 @@ Méthode naïveQuestion
Écrire une fonction max_carre1
telle que max_carre1(m)
renvoie la taille maximum d’un carré de 1 contenu dans m
.
Solution
+def max_carre1(M):
+ n = len(M)
+ for k in range(n, 0, -1):
+ if contient_carre(M, k):
+ return k
+ return 0
+
max_carre1(M)
@@ -784,16 +921,34 @@ Méthode naïveQuestion
Quelle est la complexité de max_carre1(m)
dans le pire cas ?
Solution
+est_carre(M, x, y, k)
est en \(O(k^2)\).
contient_carre(M, k)
appelle O(\(n\)) fois est_carre
, donc est en \(O(n^2 k^2)\).
max_carre1(M)
appelle contient_carre
pour \(k = 1, 2, ..., n\), donc est de complexité \(\sum_{k=1}^n O(n^2 k^2) = O(n^3 \sum_{k=1}^n k^2)\). Comme \(\sum_{k=1}^n k^2 = \frac{n(n+1)(2n+1)}{6} = O(n^3)\), la complexité totale est \(\boxed{O(n^6)}\).`
On va construire une matrice c
telle que c[x][y]
est la taille maximum d’un carré de 1 dans m
dont la case en bas à droite est m[x][y]
(c’est à dire un carré de 1 qui contient m[x][y]
mais aucun m[i][j]
si \(i > x\) ou \(j > y\)).
Par exemple, c[1][2] = 1
et c[2][3] = 2
pour la matrice \(M\) ci-dessus.
Question
Que vaut c[0][y]
et c[x][0]
?
Solution
+c[0][y] = 0
si m[0][y] = 0
et c[0][y] = 1
sinon.
+De même pour c[x][0]
.
+Remarque : c[0][y]
et c[x][0]
sont donc les mêmes valeurs que m[0][y]
et m[x][0]
, on peut donc initialiser c
comme une copie de m
.
Question
Que vaut c[x][y]
si m[x][y] = 0
?
Solution
+c[x][y] = 0
.
Question
Montrer que, si m[x][y] = 1
, c[x][y] = 1 + min(c[x-1][y], c[x][y-1], c[x-1][y-1])
.
En déduire une fonction max_carre2
telle que max_carre2(m)
renvoie la taille maximum d’un carré de 1 contenu dans m
, ainsi que les coordonnées de la case en haut à gauche d’un tel carré.
Solution
+def max_carre2(m):
+ c = m.copy()
+ for i in range(len(m)):
+ for j in range(len(m[0])):
+ if m[i][j] == 1:
+ c[i][j] = 1 + min(c[i - 1][j], c[i][j - 1], c[i - 1][j - 1])
+ return max(max(l) for l in c)
+
max_carre2(M)
@@ -818,6 +985,11 @@ Méthode naïveQuestion
Quelle est la complexité de max_carre2(m)
, en fonction des dimensions de m
? Comparer avec max_carre1(m)
.
Solution
+max_carre2(m)
est en \(\boxed{O(n^2)}\) à cause des deux boucles for
imbriquées.
+C’est donc beaucoup mieux que max_carre1(m)
qui est en \(O(n^6)\).
glouton(c, w, v)
qui renvoie la valeur totale des objets choisis par l’algorithme glouton, en considérant les objets dans l’ordre donné par w
et v
(on regarde d’abord l’objet de poids w[0]
et valeur v[0]
, puis l’objet de poids w[1]
et valeur v[1]
…).Solution
+def glouton(c, w, v):
+ """Renvoie la valeur maximum qu'on peut obtenir avec les objets
+ c: capacité du sac
+ w: poids des objets
+ v: valeur des objets
+ """
+ poids = 0
+ valeur = 0
+ for i in range(len(w)):
+ if poids + w[i] <= c:
+ poids += w[i]
+ valeur += v[i]
+ return valeur
+
glouton(10, [5, 3, 6], [4, 4, 6])
@@ -661,6 +679,16 @@ Tri des objetsQuestion
Écrire une fonction combine(L1, L2)
qui renvoie la liste des couples (L1[i], L2[i])
. On suppose que L1
et L2
ont la même longueur.
Solution
+def combine(L1, L2):
+ L = []
+ for i in range(len(L1)):
+ L.append((L1[i], L2[i]))
+ return L
+
combine([1, 2, 3], [4, 5, 6])
@@ -677,6 +705,18 @@ Tri des objetsQuestion
Écrire une fonction split(L)
telle que si L
est une liste de couples, split(L)
renvoie deux listes L1
et L2
où L1
contient les premiers éléments des couples de L
et L2
les seconds éléments des couples de L
.
Solution
+def split(L):
+ L1 = []
+ L2 = []
+ for i in range(len(L)):
+ L1.append(L[i][0])
+ L2.append(L[i][1])
+ return L1, L2
+
split([(1, 4), (2, 5), (3, 6)])
@@ -709,6 +749,15 @@ Tri des objetsQuestion
Écrire une fonction tri_poids(w, v)
qui renvoie les listes w2
et v2
obtenues à partir de w
et v
en triant les poids par ordre croissant. On pourra utiliser L.sort
, combine
et split
.
Solution
+def tri_poids(w, v):
+ L = combine(w, v)
+ L.sort()
+ return split(L)
+
tri_poids([5, 3, 6], [42, 0, 2])
@@ -729,6 +778,14 @@ Stratégies gloutonnesEn déduire une fonction glouton_poids(c, w, v)
qui renvoie la valeur totale des objets choisis par l’algorithme glouton, en considérant les objets dans l’ordre de poids croissant. On pourra réutiliser glouton
.
Est-ce que cet algorithme est toujours optimal ?
Solution
+def glouton_poids(c, w, v):
+ w, v = tri_poids(w, v)
+ return glouton(c, w, v)
+
glouton_poids(10, [5, 3, 6], [4, 4, 10])
@@ -745,6 +802,20 @@ Stratégies gloutonnesQuestion
Écrire de même des fonctions tri_valeur(w, v)
et glouton_valeur(c, w, v)
qui renvoie la valeur totale des objets choisis par l’algorithme glouton, en considérant les objets dans l’ordre de valeur décroissante (en utilisant L.sort(reverse=True)
). Est-ce que cet algorithme est toujours optimal ?
Solution
+def tri_valeur(w, v):
+ L = combine(v, w)
+ L.sort(reverse=True)
+ L1, L2 = split(L)
+ return L2, L1
+
+def glouton_valeur(c, w, v):
+ w, v = tri_valeur(w, v)
+ return glouton(c, w, v)
+
glouton_valeur(10, [5, 4, 7], [4, 4, 6])
@@ -761,6 +832,21 @@ Stratégies gloutonnesQuestion
De même, écrire une fonction glouton_ratio(c, w, v)
qui renvoie la valeur totale des objets choisis par l’algorithme glouton, en considérant les objets dans l’ordre de ratio valeur/poids décroissant. On pourra utiliser deux fois combine
.
Solution
+def tri_ratio(v, w):
+ L = combine(v, w)
+ L = combine([v[i]/w[i] for i in range(len(v))], L)
+
+ L.sort(reverse=True)
+ return split(split(L)[1])
+
+def glouton_ratio(c, w, v):
+ v, w = tri_ratio(v, w)
+ return glouton(c, w, v)
+
glouton_ratio(10, [5, 4, 7], [4, 4, 6])
@@ -786,18 +872,46 @@ Programmation dynamiqueQuestion
Que vaut \(dp[i][0]\) ?
Solution
+\(dp[i][0] = 0\) : on ne peut pas mettre d’objet dans un sac de capacité \(0\).
+Question
Exprimer \(dp[i][j]\) en fonction de \(dp[i][j-1]\) dans le cas où \(w_j > i\).
Solution
+\(dp[i][j] = dp[i][j-1]\) : on ne peut pas mettre l’objet \(j\) dans le sac de capacité \(i\).
+Question
Supposons \(w_j \leq i\). Donner une formule de récurrence sur \(dp[i][j]\), en distinguant le cas où l’objet \(j\) est choisi et le cas où il ne l’est pas.
Solution
+Question
En déduire une fonction prog_dyn(c, w, v)
qui renvoie la valeur maximum que l’on peut mettre dans un sac de capacité \(c\), en ne considérant que les \(j\) premiers objets, en remplissant une matrice dp
de taille \((c+1) \times (n+1)\).
Solution
+def prog_dyn(c, w, v):
+ n = len(w)
+ dp = [[0 for j in range(c+1)] for i in range(n+1)]
+ for i in range(1, n+1):
+ for j in range(1, c+1):
+ if j < w[i-1]:
+ dp[i][j] = dp[i-1][j]
+ else:
+ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1])
+ return dp[n][c]
+
prog_dyn(10, [5, 4, 7], [4, 4, 6])
@@ -818,15 +932,60 @@ Comparaisongenere_instance() qui renvoie un triplet \((c, w, v)\), où \(c\) est un entier aléatoire entre 1 et 1000 et \(w\), \(v\) sont des listes de 100 entiers aléatoires entre 1 et 100.
On importera random
pour utiliser random.randint(a, b)
qui génère un entier aléatoire entre \(a\) et \(b\) inclus.
Solution
+import random
+
+def genere_instance():
+ c = random.randint(1, 1000)
+ w = [random.randint(1, 100) for i in range(100)]
+ v = [random.randint(1, 100) for i in range(100)]
+ return c, w, v
+
Question
Afficher, pour chaque stratégie gloutonne (ordre de poids, ordre de valeur, ordre de ratio), l’erreur commise par rapport à la solution optimale, en moyennant sur 100 instances générées par genere_instance()
.
Quelle stratégie gloutonne est la plus efficace ?
Solution
+gp, gv, gr = 0, 0, 0
+for i in range(100):
+ c, w, v = genere_instance()
+ sol = prog_dyn(c, w, v)
+ gp += glouton_poids(c, w, v)/sol
+ gv += glouton_valeur(c, w, v)/sol
+ gr += glouton_ratio(c, w, v)/sol
+print(f"Glouton poids : {gp/100}")
+print(f"Glouton valeur : {gv/100}")
+print(f"Glouton ratio : {gr/100}")
+
Question
Comparer le temps total d’exécution de la stratégie gloutonne par ratio et de la programmation dynamique, sur 100 instances générées par genere_instance()
. On pourra importer time
et utiliser time.time()
pour obtenir le temps actuel en secondes.
Solution
+import time
+
+t1, t2 = 0, 0
+for i in range(100):
+ c, w, v = genere_instance()
+ t = time.time()
+ glouton_poids(c, w, v)
+ t1 += time.time() - t
+ t = time.time()
+ prog_dyn(c, w, v)
+ t2 += time.time() - t
+print(f"Glouton poids : {t1} s")
+print(f"Programmation dynamique : {t2} s")
+
Solution
+def prog_dyn(c, w, v):
+ n = len(w)
+ dp = [[0 for j in range(c+1)] for i in range(n+1)]
+ for i in range(1, n+1):
+ for j in range(1, c+1):
+ if j < w[i-1]:
+ dp[i][j] = dp[i-1][j]
+ else:
+ dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i-1]] + v[i-1])
+
+ # reconstruction de la solution
+ i, j = n, c
+ sol = []
+ while i > 0 and j > 0:
+ if dp[i][j] == dp[i-1][j]:
+ i -= 1
+ else:
+ sol.append(i-1)
+ j -= w[i-1]
+ i -= 1
+ return sol
+
prog_dyn(10, [5, 4, 7], [4, 4, 6])
diff --git a/searchindex.js b/searchindex.js
index 9835a2c2..985044f9 100644
--- a/searchindex.js
+++ b/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["0_python/aide_memoire","0_python/entrainement","dl/algo/prog_dyn/cours/prog_dyn","dl/algo/prog_dyn/seam_carving/seam_carving","dl/algo/prog_dyn/tp/tp1/tp_prog_dyn","dl/algo/prog_dyn/tp/tp2/tp_sac_dos","dl/ds/itc/ds_x23_differentiel/x23","dl/menu/0","dl/menu/1","dl/menu/2","dl/menu/3","dl/python/dict/tp/tp_dict","dl/python/revision/revisions","dl/slides/dict","dl/slides/lis","dl/slides/sp","dl/td/dict_polynome","dl/td/matrice_prog_dyn","intro","menu/0","menu/1","ressource","slides/dict"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["0_python/aide_memoire.ipynb","0_python/entrainement.md","dl/algo/prog_dyn/cours/prog_dyn.ipynb","dl/algo/prog_dyn/seam_carving/seam_carving.ipynb","dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb","dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb","dl/ds/itc/ds_x23_differentiel/x23.ipynb","dl/menu/0.md","dl/menu/1.md","dl/menu/2.md","dl/menu/3.md","dl/python/dict/tp/tp_dict.ipynb","dl/python/revision/revisions.ipynb","dl/slides/dict.md","dl/slides/lis.md","dl/slides/sp.md","dl/td/dict_polynome.md","dl/td/matrice_prog_dyn.md","intro.md","menu/0.md","menu/1.md","ressource.md","slides/dict.md"],objects:{},objnames:{},objtypes:{},terms:{"0":[2,3,4,5,6,11,12,18],"1":[2,3,5,11,12,18],"10":[2,3,5,12,18],"100":5,"1000":5,"11":[2,12],"12":[2,12],"13":[2,18],"14":[2,12],"15":12,"18":[2,12],"19":[2,6],"1\u00e8re":18,"1er":[5,12],"2":[2,3,4,11,12],"20":4,"200":3,"2023":18,"2024":18,"22":12,"230":3,"231":3,"2787204":12,"28627452":3,"2h":18,"3":[2,4,5,11,12],"3h":18,"3n_1":6,"3u_n":12,"4":[2,4,5,11,12],"42":[5,12],"484":3,"4845":4,"5":[2,4,5,12],"514":3,"54":12,"6":[2,5,12],"696":3,"697":3,"698":3,"699":3,"7":[2,4,5,11,12,18],"700":3,"701":3,"702":3,"705":3,"714":3,"8":[2,5,12,18],"895558157":12,"9":[11,12],"\u00e0":[2,3,4,6,11,12,18],"\u00e2":6,"\u00e8":6,"\u00e9chap":12,"\u00e9crire":[3,4,5,11,12],"\u00e9crit":18,"\u00e9crite":11,"\u00e9critur":11,"\u00e9dition":12,"\u00e9gal":6,"\u00e9gale":6,"\u00e9l\u00e9ment":[5,6,12],"\u00e9preuv":18,"\u00e9t\u00e9":[3,12],"\u00e9tant":[3,4],"\u00e9tape":[5,12],"\u00e9tiquet\u00e9":11,"\u00e9tiquett":11,"\u00e9ventuel":12,"\u00e9vite":3,"\u00eatre":[6,11],"al\u00e9atoir":5,"ann\u00e9":21,"ao\u00fbt":11,"appel\u00e9":11,"apr\u00e8":6,"ar\u00eat":[11,12],"arg_apr\u00e8":6,"arg_d\u00e9but":6,"arg_d\u00e9but_apr\u00e8":6,"arg_d\u00e9but_av":6,"associ\u00e9":4,"aucun_caract\u00e8re_commun":6,"autoris\u00e9":2,"bool\u00e9en":12,"capacit\u00e9":[2,5],"caract\u00e8r":[6,11],"case":[4,5,6],"ch\u00e2teau":6,"cha\u00een":[6,11],"cl\u00e9":[6,11,18],"class":[3,12],"commen\u00e7on":3,"compl\u00e9ter":[3,11,12],"compl\u00e9tion":11,"complexit\u00e9":[4,6,11],"concat\u00e9n":6,"conna\u00eetr":[4,18],"consid\u00e8r":[3,11],"consid\u00e9r":5,"consid\u00e9ron":12,"coordonn\u00e9":4,"corrig\u00e9":18,"cr\u00e9er":[3,11,12],"d\u00e9but":[6,12],"d\u00e9but_apr\u00e8":6,"d\u00e9but_av":6,"d\u00e9cembr":11,"d\u00e9clench":12,"d\u00e9croissant":5,"d\u00e9duir":[4,5,12],"d\u00e9duit":12,"d\u00e9fini":[3,12],"d\u00e9finir":[3,4,11,12],"d\u00e9finit":3,"d\u00e9form\u00e9":3,"d\u00e9j\u00e0":11,"d\u00e9passent":4,"d\u00e9passer":3,"d\u00e9termin":[4,12],"degr\u00e9":12,"demand\u00e9":4,"derni\u00e8r":[3,18],"diff\u00e9renc":6,"diff\u00e9rent":[5,11],"diff\u00e9rentiel":6,"do":2,"donn\u00e9":[3,4,5,12],"dur\u00e9":18,"encadr\u00e9":12,"enl\u00e8v":3,"enl\u00e8veron":3,"entr\u00e9":[5,6,12],"entra\u00een":[18,21],"etiquet\u00e9":11,"ex\u00e9cut":[5,12],"exc\u00e8d":5,"f\u00e9vrier":11,"fa\u00e7on":[3,4,12],"fin_apr\u00e8":6,"final":3,"float":[2,3,4,12],"forc\u00e9ment":12,"fran\u00e7ai":11,"fus\u00e9":12,"g\u00e9n\u00e8re":5,"g\u00e9n\u00e9r\u00e9e":5,"g\u00e9n\u00e9ral":4,"i\u00e8m":[2,3],"import":[2,3,4,5,12],"ins\u00e9r\u00e9":6,"int":4,"int\u00e9ress":5,"int\u00e9ressant":6,"intensit\u00e9":3,"it\u00e9rat":6,"long":11,"m\u00e9mo\u00efsat":[4,18],"m\u00e9thode":[3,12],"m\u00eame":[3,4,5,6,11],"mod\u00e9lis":18,"n\u00e9cessair":12,"num\u00e9ro":3,"o\u00f9":[2,3,4,5,6,11,12],"op\u00e9rat":6,"p\u00e8re":11,"pi\u00e8c":4,"pic\u00e8":4,"plut\u00f4t":4,"pointill\u00e9":4,"poss\u00e8d":[4,11],"possibilit\u00e9":[6,12],"pr\u00e9alabl":4,"pr\u00e9c\u00e9dent":[3,4,11,12],"premi\u00e8r":[3,4,21],"probl\u00e8m":[4,12],"propri\u00e9t\u00e9":[6,11],"r\u00e9\u00e9crire":[4,5],"r\u00e9alis":3,"r\u00e9currenc":[4,5],"r\u00e9cursiv":[4,11,12,18],"r\u00e9gion":3,"r\u00e9soudr":4,"r\u00e9sultat":5,"r\u00e9sum\u00e9":21,"r\u00e9utilis":[5,12],"recherch\u00e9":11,"redimensionn\u00e9":3,"rentr\u00e9":18,"renvoy\u00e9":3,"repr\u00e9sent":[3,11],"repr\u00e9sent\u00e9":[3,11],"return":[2,3,4,6,11,12],"rh\u00f4ne":3,"sup\u00e9lec":18,"suppl\u00e9mentair":11,"supprim\u00e9":6,"sym\u00e9triqu":12,"t\u00e9l\u00e9chargeant":3,"t\u00e9l\u00e9charger":4,"t\u00e9l\u00e9phone":11,"texte_versionn\u00e9":6,"textes_\u00e9gaux":6,"totalit\u00e9":6,"tr\u00e8":4,"transpos\u00e9":12,"tri\u00e9":5,"tri\u00e9e":[5,12],"trouv\u00e9":[6,12],"true":[4,5,6,11,12],"utilis\u00e9":[4,11],"v\u00e9rifi":12,"v\u00e9rifier":[3,11,12],"visit\u00e9":[6,12],"while":[6,12],A:[6,12],In:2,On:[3,4,5,6,11,12],_:[6,12],a_1:4,a_2:4,a_3:4,a_k:4,ab:3,abord:5,absolu:3,actuel:5,acycliqu:11,admiss:6,affich:[3,5,11,12],affichag:3,ainsi:[3,4,18],air:5,ajout:[3,4,5,6,11,12,18],algorithm:6,algorithmiqu:1,all:12,alor:[3,4,5,6],alp:3,anglai:11,annot:6,annul:6,apparaiss:11,apparten:11,apparti:[11,12],appel:[11,12],append:[3,6,12],appendleft:12,appliqu:6,approx:18,april:11,arc:6,aret:11,arg_av:6,argument:[4,12],arrai:[3,6],art:11,assert:[4,6,12],associ:11,atteindr:3,attent:3,au:[3,4,5,6,11,12],aucun:4,august:11,aussi:11,automatiqu:11,autr:[3,18],auvergn:3,aux:[2,4,11,12,18],auxiliair:11,avant:6,avec:[3,4,5,6,11,12,18],avez:[3,4],avoir:11,avril:11,ax:11,ayant:11,b:[5,6,11,12],ba:[3,4,6,12],base:[4,6],basthon:[3,12],bcpst:21,becirspah:21,begin:[2,6],besoin:12,bf:12,bien:[3,6],binom:4,binom_dp:4,binom_memo:4,binom_rec:4,blanc:3,bord:3,boucl:[11,12,18],box:12,c:[2,3,4,5,6,11,12],ca:[4,5,6,11],cach:2,calcul:[4,6,12],call:2,cap:11,capytal:3,car:[4,6,11],cart:11,cat:11,ccinp:18,cd:11,ce:[3,4,5,6,11,12],cela:[3,4,5,11,12],cell:[2,4,6],cellul:12,central:18,cepend:6,cet:5,cett:[3,4,11,12],ceux:11,chacun:6,chaqu:[3,5,6,11,12],chargeant:3,charger:3,chemin:[11,18],cherch:12,chercher:3,chien:6,choisir:5,choisiss:5,choisit:5,choix:[3,12],ci:[3,4,5,6,11,12],clairement:6,classiqu:[3,12],cliquant:12,cliquer:3,cmap:3,code:[3,11,12],coeffici:18,collect:12,colonn:[3,4],combin:5,comm:[3,4,6,12],command:12,commenc:[3,6,12],commis:5,compar:[4,5,12],compt:[3,11],comptant:11,concour:18,confirm:18,conflit:6,connect:3,connex:[11,12],conserv:11,consist:[3,5,12],construir:[4,5],construit:3,conten:[3,11,12],contenir:11,contenu:4,contiendra:4,contienn:[4,11],contient:[3,4,5,6,11],contient_carr:4,convers:3,copi:[2,6,11],copier:11,cor:11,cord:11,corn:11,correct:11,correspond:[3,4,6,11],correspondr:6,couleur:3,count:11,coupl:5,cour:[5,11,12,21],courant:[6,11],croissant:[4,5,6,12],ctrl:12,cycl:11,d1:11,d2:11,d:[1,2,4,5,6,11],d_:3,dan:[2,3,5,6,11,12,18],de:[1,2,11,21],decemb:11,deepcopi:2,def:[2,3,4,6,11,12],defin:2,deg:12,depui:[3,12],dequ:12,dernier:12,descendr:11,dessin:11,dessou:[5,6,11,12],dessu:[3,4,11,12],deux:[4,5,6,11,12],df:12,dict:11,dictionnair:[4,18],diff1:6,diff2:6,diff:6,dijkstra:6,dimanch:11,dimens:[3,4],diminu:6,dire:[3,4,11,12],direct:11,dist:[2,6,12],dist_fin:6,distanc:[6,12],distingu:[4,5],dit:11,divis:12,doit:11,donc:[3,4,5,6,12],donner:5,dont:4,dorer:11,dp:[2,5],dp_:2,dp_chemin:3,droit:[4,6,12],ds:18,du:[3,4,6,11,12],dynamiqu:[6,18],e:[6,11,12],effectu:3,efficac:5,elif:[6,12],ell:5,els:[2,6,11,12],en:[3,4,5,11],encor:12,end:[2,6],enlever_chemin:3,ensembl:[6,11],ent:3,entier:[4,5],entr:[3,5,6,11,12],enver:3,erreur:[5,12],est:[2,3,4,5,6,11,12],est_carr:4,et:[2,3,4,5,6,11,12,18],euro:4,exempl:[3,4,5,11,12],exercic:[1,18,21],exist:11,expliqu:4,exprim:5,extrair:12,extraire_min:6,extrait:6,f:[4,6,11],facil:[1,3],fair:[4,6],fals:[4,6,11,12],faut:[3,6,12],februari:11,feuill:11,fichier:[3,4],figur:6,fil:11,file:[6,12],fin:[6,11],fin_av:6,flottant:3,floydwarshal:2,foi:[3,4,5,6,12],fonction:[3,4,5,6,11,12,18],form:[11,12],formul:[3,4,5],fort:[3,6],fr_to_en:11,fridai:11,from:[2,12],functool:2,fusionn:6,g:[2,3,6,12],g_:3,g_list:12,gauch:[3,4,6,12],genere_inst:5,glouton_poid:5,glouton_ratio:5,glouton_valeur:5,grai:3,grand:[3,6],graph:[6,11],gri:3,gro:4,h:6,haut:[3,4,6,11,12],hauteur:3,heuristiqu:6,historiqu:6,hor:12,http:4,i:[2,3,4,5,11,12],ici:[3,12],identifi:3,identiqu:6,il:[3,5,6,11,12],importera:5,imposs:4,imread:3,imshow:3,inclu:5,indic:[3,4,6,11,12],inf:[2,4,12],infti:[2,4],inscrir:4,inscriv:4,instanc:5,instruct:3,intuitiv:3,invers:[3,6],j:[2,3,4,5,6,12],j_mini:3,januari:11,janvier:11,jeu:12,jeudi:11,jour:11,juillet:11,juin:11,juli:11,june:11,jusqu:3,just:11,k:[2,3,4,6,11],knapsack2:2,knapsack:2,knapsack_memo2:2,knapsack_memo:2,l1:[5,12],l2:[5,12],l3:12,l:[2,4,5,6,11,12],la:[2,3,4,6,11,12],lamartin:11,lambda:4,largeur:3,last:2,ldot:4,le:[2,3,4,5,6,11,12,18],left:6,len:[2,3,6,11,12],leq:5,lequel:5,lesquel:12,lettr:[6,11],leur:[6,11],levenshtein:6,lexicographiqu:5,lieu:12,lign:[3,4],line:2,linewidth:3,list:[3,4,6,11],ll:6,log:6,logarithmiqu:6,longueur:[5,6,11],lor:12,lundi:11,m1:11,m2:[3,11],m:[2,3,4,6,11,12,21],m_:3,ma:3,mai:[4,11],mainten:[3,12],majoritaire2:11,make_matrix2:12,make_matrix3:12,make_matrix:12,map:4,mar:11,march:11,mardi:11,marquer:12,mat_to_list:12,math:18,mathbf:12,matplotlib:3,matric:[3,5,6,18],matrice_gradi:3,mauvais:4,max:2,max_carre1:4,max_carre2:4,maximum:[2,4,5],meilleur:11,mercredi:11,mettr:[2,5,12],milieu:12,min:[2,3,4,6],min_chemin:3,min_energie_ba:3,mine:18,mini:3,minim:3,minimal:3,minimum:4,mode:12,modif:18,modifi:[3,6,18],moi:11,moin:[4,6,12],mondai:11,montrer:4,most:2,mot:11,moyen:1,moyenn:5,mp:18,mt:12,n1:[6,11],n2:6,n:[2,3,4,5,6,11,12],n_1:[6,11],n_2:[6,11],n_aret:12,name:2,nameerror:2,ne:[3,4,5,11,12],neq:4,net:4,niveau:3,nk:6,noeud:11,noir:3,nombr:[2,3,4,6,11,12],non:[3,4,12],none:11,note:6,nou:3,nouvel:[11,12],novemb:11,novembr:11,np:3,numpi:3,o:[6,11],objectif:[3,5],objet:2,obtenu:[3,5,11],obtient:5,occur:11,octob:11,octobr:11,officiel:[18,21],ok:11,ont:5,optim:5,optimal:5,option:18,ordr:[5,6,11,12],oreo:11,orthographiqu:11,ou:[3,4,6],oui:4,ouvrir:3,p067_triangl:4,p:[3,6,11,12],pa:[3,4,5,11,12],par:[4,5,11],parcour:[3,11],parcourir:[11,12,18],parcourt:[6,11],parcouru:11,parmi:4,parti:[4,12],particuli:11,partir:[3,4,5],pascal:4,pass:3,passant:6,passer:[3,12],pc:18,permett:12,petit:6,peu:3,peut:[2,3,4,5,6,11,12],pire:4,pixel:3,place:3,plan:18,plot:3,plt:3,plu:[3,5,6,11,12],plusieur:[4,12],pmatrix:2,png:3,poid:[2,5,6],pont:18,pop:[6,12],posera:4,posit:3,positif:5,possibl:3,pour:[2,3,5,6,11,12,21],pourquoi:4,pourra:[3,4,5,11,12],pouvez:[3,12],premier:[5,6],prend:3,prendr:4,princip:[4,18],print:[3,6,11,12],priori:3,prog_dyn:5,programm:[6,12,18,21],project:4,projecteul:4,propos:12,proposit:11,psi:18,pui:[3,5,12],pyplot:3,python:[4,21],pyzo:12,q:12,qcm:18,qu:[4,5,6,11,12],quand:6,que:[2,3,4,5,6,11,12,18],quelconqu:11,quell:[4,5,11],qui:[3,5,6,11,12],r:[2,3,4,6,11],racin:11,rajout:6,randint:5,random:5,rang:[2,3,4,6,11,12],rapid:[3,12],rappel:[5,11,12],rapport:5,ratio:5,readlin:4,recent:2,recherch:12,recopi:6,refais:18,regard:[4,5,12],relat:4,relativ:3,remarqu:[3,4,5,11],remont:[3,5],remplace_cour:6,rempli:[4,12],remplir:[4,12],remplira:4,rempliss:5,rendr:[4,6],renvoi:[2,3,4,5,12],renvoy:[4,11,12],request:4,requis:4,resourc:4,rest:12,restant:5,restreint:12,revers:5,revient:4,revoir:12,right:6,roug:3,s:[4,6,11,12,18,21],sa:[6,11],sac:2,sait:4,samedi:11,san:11,saturdai:11,sauf:[3,4],savoir:[12,18],se:[3,6,12],seam_carv:3,seam_carving_im:3,second:5,semain:11,septemb:11,septembr:11,sera:3,sert:11,set:11,seulement:3,shape:3,shift:12,show:3,si:[3,4,5,6,11,12],simplifi:11,sinon:[4,6,12],site:18,soient:6,soif:6,soit:[3,4,5,12],solut:5,sombr:3,somm:[3,4,6],sommet:[6,11,12],son:[5,11,12],sont:[5,6,11,12],sort:5,sortant:11,sorti:[5,6],sortir:12,sou:[4,11,12],souhait:[3,4,12],souvent:11,split:[4,5],sql:1,sqrt:12,stocker:[4,11],strictement:5,succ:6,successeur:6,suffit:6,suit:[3,12],suivant:[3,4,5,6,11,12],sundai:11,suppos:5,supposera:4,supposon:5,supprim:[3,6,12],sur:[3,4,5,11,12],symetriqu:12,t:[6,11],tableau:3,tableaux:4,taill:[3,4,5,6,11,12],tant:12,techniqu:3,tel:[3,4],tell:[3,4,5,12],temp:[3,4,5],termin:6,test:[11,12],tester:[3,5,11,12],text:6,textbf:12,texte1:6,texte2:6,thursdai:11,time:[3,4,5,12],total:[5,6],tou:12,toujour:5,tout:3,tower:3,tp:18,tr:6,traceback:2,traduct:11,tranch:6,transpose:12,tri:11,tri_poid:5,tri_valeur:5,triangl:4,triant:5,trie:5,trie_add:11,trie_ex:11,trie_ha:11,trie_print:11,trie_siz:11,trier:5,triplet:5,trop:3,trouver:[3,12],tuesdai:11,txt:4,u:[2,6,12],u_0:12,u_:12,u_n:12,un:[2,5,6,11,12,18],underlin:12,uniform:3,uniqu:12,urllib:4,urlopen:4,utilis:[3,4,5,6,11,12],utilisera:11,v2:5,v:[2,5,6,11,12],v_1:5,v_j:5,v_n:5,va:[4,6,11,12],valabl:[3,12],valeur:[2,3,4,5,11],variabl:[3,12],variat:3,vaut:[4,5],vendredi:11,venon:3,versionn:6,vertic:3,verticaux:3,veut:[3,4],vide:[11,12],visit:12,vo:3,voisin:12,votr:[3,12],vou:[3,4,12],vraiment:12,vu:5,w2:5,w:[2,5],w_1:5,w_j:5,w_n:5,wednesdai:11,x:[2,4,11,12,18],y:[3,4,6,11],z:6,zero:3,zeros_lik:3,zone:12},titles:["R\u00e9sum\u00e9 Python","S\u2019entra\u00eener \u00e0 programmer","Programmation dynamique","DM : Redimensionnement d\u2019image par Seam Carving","TP 1 : Programmation dynamique","TP 2 : Probl\u00e8me du sac \u00e0 dos","DS 1 MP* Corrig\u00e9 (X-ENS 2023)","Cours","Exercices","Cours","Exercices","TP : Dictionnaire","TP : R\u00e9visions de 1\u00e8re ann\u00e9e","Cours : Dictionnaire","Exemple : Plus longue sous-suite croissante","Exemple : Algorithmes de plus court chemin","Exercice : Polyn\u00f4mes","Exercice : Chemin dans une matrice","Cours d\u2019informatique commune en 2\u00e8me ann\u00e9e de CPGE au lyc\u00e9e La Martini\u00e8re Monplaisir","Cours","TP","Ressources","Cours : Dictionnaire"],titleterms:{"1":[4,6],"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":6,"17":6,"1\u00e8re":12,"2":[5,6],"2023":6,"2\u00e8me":18,"3":6,"4":6,"5":6,"6":6,"7":6,"8":6,"9":6,"\u00e0":[1,5],"\u00e9l\u00e9ment":11,"\u00e9nergi":3,"\ufb01xe":6,"ann\u00e9":[12,18],"carr\u00e9":4,"corrig\u00e9":6,"di\ufb00\u00e9rentiel":6,"do":5,"enracin\u00e9":11,"entra\u00een":1,"lyc\u00e9":18,"m\u00e9thode":4,"martini\u00e8r":18,"na\u00efv":4,"polyn\u00f4m":16,"pr\u00e9fix":11,"probl\u00e8m":5,"r\u00e9sum\u00e9":0,"r\u00e9vision":12,"repr\u00e9sent":12,"strat\u00e9gi":5,adjac:12,algorithm:[5,15],anagramm:11,arbr:11,au:18,base:12,bellman:2,binomi:4,bonu:3,calcul:3,carv:3,ceux:4,chargement:3,chemin:[2,3,15,17],choisi:5,coeffici:4,commun:18,comparaison:5,cour:[7,9,13,18,19,22],court:[2,15],cpge:18,croissant:14,d:[3,12,18],dan:[4,17],de:[3,4,5,6,12,15,18],dichotomi:12,dictionnair:[11,13,22],dm:3,ds:6,du:[0,5],dynamiqu:[2,3,4,5],en:[6,12,18],enlev:3,exempl:[14,15],exercic:[8,10,11,12,16,17],extrait:0,fini:4,floyd:2,ford:2,glouton:5,gloutonn:5,gradient:3,grand:4,graph:12,i:6,ii:6,imag:3,informatiqu:18,internationalis:11,l:3,la:[5,18],largeur:12,leetcod:1,list:[5,12],longu:14,majoritair:11,matric:[4,12,17],minimum:3,monnai:4,monplaisir:18,mp:6,objet:5,obtenir:5,officiel:0,ont:4,par:[3,6,12],parcour:12,parti:6,plu:[2,4,14,15],posit:6,pour:4,profondeur:12,programm:[0,1,2,3,4,5],python:[0,12],question:[3,4,5,6,12],qui:4,redimensionn:3,rendu:4,ressourc:21,s:1,sac:5,seam:3,solut:[3,11,12],sou:14,suit:14,sur:6,tp:[4,5,11,12,20],tri:5,trie:11,un:[3,4,17],variabl:6,warshal:2,x:6}})
\ No newline at end of file
+Search.setIndex({docnames:["0_python/aide_memoire","0_python/entrainement","dl/algo/prog_dyn/cours/prog_dyn","dl/algo/prog_dyn/seam_carving/seam_carving","dl/algo/prog_dyn/tp/tp1/tp_prog_dyn","dl/algo/prog_dyn/tp/tp2/tp_sac_dos","dl/ds/itc/ds_x23_differentiel/x23","dl/menu/0","dl/menu/1","dl/menu/2","dl/menu/3","dl/python/dict/tp/tp_dict","dl/python/revision/revisions","dl/slides/dict","dl/slides/lis","dl/slides/sp","dl/td/dict_polynome","dl/td/matrice_prog_dyn","intro","menu/0","menu/1","ressource","slides/dict"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":5,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,"sphinx.ext.intersphinx":1,sphinx:56},filenames:["0_python/aide_memoire.ipynb","0_python/entrainement.md","dl/algo/prog_dyn/cours/prog_dyn.ipynb","dl/algo/prog_dyn/seam_carving/seam_carving.ipynb","dl/algo/prog_dyn/tp/tp1/tp_prog_dyn.ipynb","dl/algo/prog_dyn/tp/tp2/tp_sac_dos.ipynb","dl/ds/itc/ds_x23_differentiel/x23.ipynb","dl/menu/0.md","dl/menu/1.md","dl/menu/2.md","dl/menu/3.md","dl/python/dict/tp/tp_dict.ipynb","dl/python/revision/revisions.ipynb","dl/slides/dict.md","dl/slides/lis.md","dl/slides/sp.md","dl/td/dict_polynome.md","dl/td/matrice_prog_dyn.md","intro.md","menu/0.md","menu/1.md","ressource.md","slides/dict.md"],objects:{},objnames:{},objtypes:{},terms:{"0":[2,3,4,5,6,11,12,18],"1":[2,3,5,11,12,18],"10":[2,3,5,12,18],"100":5,"1000":5,"11":[2,12],"12":[2,12],"13":[2,18],"14":[2,12],"15":12,"18":[2,12],"19":[2,6],"1\u00e8re":18,"1er":[5,12],"2":[2,3,4,11,12],"20":4,"200":3,"2023":18,"2024":18,"22":12,"230":3,"231":3,"2787204":12,"28627452":3,"2h":18,"2n":4,"3":[2,4,5,11,12],"3h":18,"3n_1":6,"3u_n":12,"4":[2,4,5,11,12],"42":[5,12],"484":3,"4845":4,"5":[2,4,5,12],"514":3,"54":12,"6":[2,4,5,12],"696":3,"697":3,"698":3,"699":3,"7":[2,4,5,11,12,18],"700":3,"701":3,"702":3,"705":3,"714":3,"8":[2,5,12,18],"895558157":12,"9":[11,12],"\u00e0":[2,3,4,6,11,12,18],"\u00e2":6,"\u00e8":6,"\u00e9chap":12,"\u00e9crire":[3,4,5,11,12],"\u00e9crit":18,"\u00e9crite":11,"\u00e9critur":11,"\u00e9dition":12,"\u00e9gal":6,"\u00e9gale":6,"\u00e9l\u00e9ment":[5,6,12],"\u00e9preuv":18,"\u00e9t\u00e9":[3,12],"\u00e9tant":[3,4],"\u00e9tape":[5,12],"\u00e9tiquet\u00e9":11,"\u00e9tiquett":11,"\u00e9ventuel":12,"\u00e9vite":3,"\u00eatre":[6,11],"al\u00e9atoir":5,"ann\u00e9":21,"ao\u00fbt":11,"appel\u00e9":11,"apr\u00e8":6,"ar\u00eat":[11,12],"arg_apr\u00e8":6,"arg_d\u00e9but":6,"arg_d\u00e9but_apr\u00e8":6,"arg_d\u00e9but_av":6,"associ\u00e9":4,"aucun_caract\u00e8re_commun":6,"autoris\u00e9":2,"bool\u00e9en":12,"capacit\u00e9":[2,5],"caract\u00e8r":[6,11],"case":[4,5,6],"ch\u00e2teau":6,"cha\u00een":[6,11],"cl\u00e9":[6,11,18],"class":[3,12],"commen\u00e7on":3,"compl\u00e9ter":[3,11,12],"compl\u00e9tion":11,"complexit\u00e9":[4,6,11],"concat\u00e9n":6,"conna\u00eetr":[4,18],"consid\u00e8r":[3,4,11],"consid\u00e9r":5,"consid\u00e9ron":12,"coordonn\u00e9":4,"corrig\u00e9":18,"cr\u00e9er":[3,11,12],"d\u00e9but":[6,12],"d\u00e9but_apr\u00e8":6,"d\u00e9but_av":6,"d\u00e9cembr":11,"d\u00e9clench":12,"d\u00e9croissant":5,"d\u00e9duir":[4,5,12],"d\u00e9duit":12,"d\u00e9fini":[3,12],"d\u00e9finir":[3,4,11,12],"d\u00e9finit":3,"d\u00e9form\u00e9":3,"d\u00e9j\u00e0":11,"d\u00e9passent":4,"d\u00e9passer":3,"d\u00e9termin":[4,12],"degr\u00e9":12,"demand\u00e9":4,"derni\u00e8r":[3,18],"diff\u00e9renc":6,"diff\u00e9rent":[5,11],"diff\u00e9rentiel":6,"do":2,"donn\u00e9":[3,4,5,12],"dur\u00e9":18,"encadr\u00e9":12,"enl\u00e8v":3,"enl\u00e8veron":3,"entr\u00e9":[5,6,12],"entra\u00een":[18,21],"etiquet\u00e9":11,"ex\u00e9cut":[5,12],"exc\u00e8d":5,"f\u00e9vrier":11,"fa\u00e7on":[3,4,12],"fin_apr\u00e8":6,"final":3,"float":[2,3,4,12],"forc\u00e9ment":12,"fran\u00e7ai":11,"fus\u00e9":12,"g\u00e9n\u00e8re":5,"g\u00e9n\u00e9r\u00e9e":5,"g\u00e9n\u00e9ral":4,"i\u00e8m":[2,3],"imbriqu\u00e9":4,"import":[2,3,4,5,12],"ins\u00e9r\u00e9":6,"int":4,"int\u00e9ress":5,"int\u00e9ressant":6,"intensit\u00e9":3,"it\u00e9rat":6,"long":11,"m\u00e9mo\u00efsat":[4,18],"m\u00e9thode":[3,12],"m\u00eame":[3,4,5,6,11],"mod\u00e9lis":18,"n\u00e9cessair":12,"num\u00e9ro":3,"o\u00f9":[2,3,4,5,6,11,12],"op\u00e9rat":6,"p\u00e8re":11,"pi\u00e8c":4,"pic\u00e8":4,"plut\u00f4t":4,"pointill\u00e9":4,"poss\u00e8d":[4,11],"possibilit\u00e9":[4,6,12],"pr\u00e9alabl":4,"pr\u00e9c\u00e9dent":[3,4,11,12],"premi\u00e8r":[3,4,21],"probl\u00e8m":[4,12],"propri\u00e9t\u00e9":[6,11],"r\u00e9\u00e9crire":[4,5],"r\u00e9alis":3,"r\u00e9currenc":[4,5],"r\u00e9cursiv":[4,11,12,18],"r\u00e9gion":3,"r\u00e9soudr":4,"r\u00e9sultat":5,"r\u00e9sum\u00e9":21,"r\u00e9utilis":[5,12],"recherch\u00e9":11,"redimensionn\u00e9":3,"rentr\u00e9":18,"renvoy\u00e9":3,"repr\u00e9sent":[3,11],"repr\u00e9sent\u00e9":[3,11],"return":[2,3,4,5,6,11,12],"rh\u00f4ne":3,"sup\u00e9lec":18,"suppl\u00e9mentair":11,"supprim\u00e9":6,"sym\u00e9triqu":12,"t\u00e9l\u00e9chargeant":3,"t\u00e9l\u00e9charger":4,"t\u00e9l\u00e9phone":11,"texte_versionn\u00e9":6,"textes_\u00e9gaux":6,"totalit\u00e9":6,"tr\u00e8":4,"transpos\u00e9":12,"tri\u00e9":5,"tri\u00e9e":[5,12],"trouv\u00e9":[6,12],"true":[4,5,6,11,12],"utilis\u00e9":[4,11],"v\u00e9rifi":12,"v\u00e9rifier":[3,11,12],"visit\u00e9":[6,12],"while":[5,6,12],A:[6,12],In:2,On:[3,4,5,6,11,12],_:[4,5,6,12],a_1:4,a_2:4,a_3:4,a_k:4,ab:3,abord:5,absolu:3,actuel:5,acycliqu:11,admiss:6,affich:[3,5,11,12],affichag:3,ainsi:[3,4,18],air:5,ajout:[3,4,5,6,11,12,18],algorithm:6,algorithmiqu:1,all:12,alor:[3,4,5,6],alp:3,anglai:11,annot:6,annul:6,apparaiss:11,apparten:11,apparti:[11,12],appel:[4,11,12],append:[3,5,6,12],appendleft:12,appliqu:6,approx:18,april:11,arc:6,aret:11,arg_av:6,argument:[4,12],arrai:[3,6],art:11,assert:[4,6,12],associ:11,atteindr:3,attent:3,au:[3,4,5,6,11,12],aucun:4,august:11,aussi:11,automatiqu:11,autr:[3,18],auvergn:3,aux:[2,4,11,12,18],auxiliair:11,avant:6,avec:[3,4,5,6,11,12,18],avez:[3,4],avoir:11,avril:11,ax:11,ayant:11,b:[5,6,11,12],ba:[3,4,6,12],base:[4,6],basthon:[3,12],bcpst:21,beaucoup:4,becirspah:21,begin:[2,6],besoin:12,bf:12,bien:[3,6],binom:4,binom_dp:4,binom_memo:4,binom_rec:4,blanc:3,bord:3,boucl:[4,11,12,18],box:[4,12],c:[2,3,4,5,6,11,12],ca:[4,5,6,11],cach:2,calcul:[4,6,12],call:2,cap:11,capytal:3,car:[4,6,11],cart:11,cat:11,caus:4,ccinp:18,cd:11,ce:[3,4,5,6,11,12],cela:[3,4,5,11,12],cell:[2,4,6],cellul:12,central:18,cepend:6,cet:5,cett:[3,4,11,12],ceux:11,chacun:6,chaqu:[3,5,6,11,12],chargeant:3,charger:3,chemin:[11,18],cherch:12,chercher:3,chien:6,choisir:5,choisiss:5,choisit:5,choix:[3,12],ci:[3,4,5,6,11,12],clairement:6,classiqu:[3,12],cliquant:12,cliquer:3,cmap:3,code:[3,11,12],coeffici:18,collect:12,colonn:[3,4],combin:5,comm:[3,4,6,12],command:12,commenc:[3,6,12],commis:5,compar:[4,5,12],compt:[3,11],comptant:11,concour:18,confirm:18,conflit:6,connect:3,connex:[11,12],conserv:[4,11],consist:[3,5,12],construir:[4,5],construit:3,conten:[3,11,12],contenir:11,contenu:4,contiendra:4,contienn:[4,11],contient:[3,4,5,6,11],contient_carr:4,convers:3,copi:[2,4,6,11],copier:11,cor:11,cord:11,corn:11,correct:11,correspond:[3,4,6,11],correspondr:6,couleur:3,count:11,coupl:5,cour:[4,5,11,12,21],courant:[6,11],croissant:[4,5,6,12],ctrl:12,cycl:11,d1:11,d2:11,d:[1,2,4,5,6,11],d_:3,dan:[2,3,5,6,11,12,18],de:[1,2,11,21],decemb:11,deepcopi:2,def:[2,3,4,5,6,11,12],defin:2,deg:12,depui:[3,12],dequ:12,dernier:12,descendr:11,dessin:11,dessou:[5,6,11,12],dessu:[3,4,11,12],deux:[4,5,6,11,12],df:12,dict:11,dictionnair:[4,18],diff1:6,diff2:6,diff:6,dijkstra:6,dimanch:11,dimens:[3,4],diminu:6,dire:[3,4,11,12],direct:11,dist:[2,6,12],dist_fin:6,distanc:[6,12],distingu:[4,5],dit:11,divis:12,doit:11,donc:[3,4,5,6,12],donner:5,dont:4,dorer:11,dp:[2,5],dp_:2,dp_chemin:3,droit:[4,6,12],ds:18,du:[3,4,6,11,12],dynamiqu:[6,18],e:[6,11,12],effectu:3,efficac:5,elif:[6,12],ell:5,els:[2,4,5,6,11,12],en:[3,4,5,11],encor:[4,12],end:[2,6],enlever_chemin:3,ensembl:[6,11],ent:3,entier:[4,5],entr:[3,5,6,11,12],enver:3,erreur:[5,12],est:[2,3,4,5,6,11,12],est_carr:4,et:[2,3,4,5,6,11,12,18],euro:4,exempl:[3,4,5,11,12],exercic:[1,18,21],exist:11,expliqu:4,exprim:5,extrair:12,extraire_min:6,extrait:6,f:[4,5,6,11],facil:[1,3],fair:[4,6],fals:[4,6,11,12],faut:[3,4,6,12],februari:11,feuill:11,fichier:[3,4],figur:6,fil:11,file:[6,12],fin:[6,11],fin_av:6,flottant:3,floydwarshal:2,foi:[3,4,5,6,12],fonction:[3,4,5,6,11,12,18],form:[11,12],formul:[3,4,5],fort:[3,6],fr_to_en:11,frac:4,fridai:11,from:[2,12],functool:2,fusionn:6,g:[2,3,6,12],g_:3,g_list:12,gauch:[3,4,6,12],genere_inst:5,geq:[4,5],glouton_poid:5,glouton_ratio:5,glouton_valeur:5,gp:5,gr:5,grai:3,grand:[3,6],graph:[6,11],gri:3,gro:4,gv:5,h:6,haut:[3,4,6,11,12],hauteur:3,heuristiqu:6,historiqu:6,hor:12,http:4,i:[2,3,4,5,11,12],ici:[3,12],identifi:3,identiqu:6,il:[3,4,5,6,11,12],importera:5,imposs:4,imread:3,imshow:3,inclu:5,indic:[3,4,6,11,12],inf:[2,4,12],infti:[2,4],initialis:4,inscrir:4,inscriv:4,instanc:5,instruct:3,intuitiv:3,invers:[3,6],j:[2,3,4,5,6,12],j_mini:3,januari:11,janvier:11,jeu:12,jeudi:11,jour:11,juillet:11,juin:11,juli:11,june:11,jusqu:3,just:11,k:[2,3,4,6,11],knapsack2:2,knapsack:2,knapsack_memo2:2,knapsack_memo:2,l1:[5,12],l2:[5,12],l3:12,l:[2,4,5,6,11,12],la:[2,3,4,6,11,12],lamartin:11,lambda:4,largeur:3,last:2,ldot:4,le:[2,3,4,5,6,11,12,18],left:6,len:[2,3,4,5,6,11,12],leq:5,lequel:5,lesquel:12,lettr:[6,11],leur:[6,11],levenshtein:6,lexicographiqu:5,lieu:12,lign:[3,4],line:2,linewidth:3,list:[3,4,6,11],ll:6,log:6,logarithmiqu:6,longueur:[5,6,11],lor:12,lundi:11,m1:11,m2:[3,11],m:[2,3,4,6,11,12,21],m_:3,ma:3,mai:[4,11],mainten:[3,12],majoritaire2:11,make_matrix2:12,make_matrix3:12,make_matrix:12,map:4,mar:11,march:11,mardi:11,marquer:12,mat_to_list:12,math:18,mathbf:12,matplotlib:3,matric:[3,5,6,18],matrice_gradi:3,mauvais:4,max:[2,4,5],max_carre1:4,max_carre2:4,maximum:[2,4,5],meilleur:11,mercredi:11,mettr:[2,5,12],mieux:4,milieu:12,min:[2,3,4,6],min_chemin:3,min_energie_ba:3,mine:18,mini:3,minim:3,minimal:3,minimum:4,mode:12,modif:18,modifi:[3,6,18],moi:11,moin:[4,6,12],mondai:11,montrer:4,most:2,mot:11,moyen:1,moyenn:5,mp:18,mt:12,n1:[6,11],n2:6,n:[2,3,4,5,6,11,12],n_1:[6,11],n_2:[6,11],n_aret:12,name:2,nameerror:2,ne:[3,4,5,11,12],neq:4,net:4,niveau:3,nk:6,noeud:11,noir:3,nombr:[2,3,4,6,11,12],non:[3,4,12],none:11,note:6,nou:3,nouvel:[11,12],novemb:11,novembr:11,np:3,numpi:3,o:[4,6,11],o_j:5,objectif:[3,5],objet:2,obtenu:[3,5,11],obtient:5,occur:11,octob:11,octobr:11,officiel:[18,21],ok:11,ont:5,optim:5,optimal:5,option:18,ordr:[5,6,11,12],oreo:11,orthographiqu:11,ou:[3,4,6],oui:4,ouvrir:3,p067_triangl:4,p:[3,6,11,12],pa:[3,4,5,11,12],par:[4,5,11],parcour:[3,11],parcourir:[11,12,18],parcourt:[6,11],parcouru:11,parmi:4,parti:[4,12],particuli:11,partir:[3,4,5],pascal:4,pass:3,passant:6,passer:[3,12],pc:18,permett:12,petit:6,peu:3,peut:[2,3,4,5,6,11,12],pire:4,pixel:3,place:3,plan:18,plot:3,plt:3,plu:[3,5,6,11,12],plusieur:[4,12],pmatrix:2,png:3,poid:[2,5,6],pont:18,pop:[6,12],posera:4,posit:3,positif:5,possibl:3,pour:[2,3,5,6,11,12,21],pourquoi:4,pourra:[3,4,5,11,12],pouvez:[3,12],premier:[5,6],prenant:5,prend:3,prendr:[4,5],princip:[4,18],print:[3,5,6,11,12],priori:3,prog_dyn:5,programm:[6,12,18,21],project:4,projecteul:4,propos:12,proposit:11,psi:18,pui:[3,5,12],pyplot:3,python:[4,21],pyzo:12,q:12,qcm:18,qu:[4,5,6,11,12],quand:6,que:[2,3,4,5,6,11,12,18],quelconqu:11,quell:[4,5,11],qui:[3,5,6,11,12],r:[2,3,4,6,11],racin:11,rajout:6,randint:5,random:5,rang:[2,3,4,5,6,11,12],rapid:[3,12],rappel:[5,11,12],rapport:5,ratio:5,readlin:4,recent:2,recherch:12,reconstruct:5,recopi:6,refais:18,regard:[4,5,12],relat:4,relativ:3,remarqu:[3,4,5,11],remont:[3,5],remplace_cour:6,rempli:[4,12],remplir:[4,12],remplira:4,rempliss:5,rendr:[4,6],rendu_memo:4,renvoi:[2,3,4,5,12],renvoy:[4,11,12],request:4,requis:4,resourc:4,rest:12,restant:5,restreint:12,revers:5,revient:4,revoir:12,right:6,roug:3,s:[4,5,6,11,12,18,21],sa:[6,11],sac:2,sait:4,samedi:11,san:[5,11],saturdai:11,sauf:[3,4],savoir:[12,18],se:[3,6,12],seam_carv:3,seam_carving_im:3,second:5,semain:11,septemb:11,septembr:11,sera:3,sert:11,set:11,seulement:3,shape:3,shift:12,show:3,si:[3,4,5,6,11,12],simplifi:11,sinon:[4,6,12],site:18,soient:6,soif:6,soit:[3,4,5,12],sol:5,sombr:3,somm:[3,4,6],sommet:[6,11,12],son:[5,11,12],sont:[4,5,6,11,12],sort:5,sortant:11,sorti:[5,6],sortir:12,sou:[4,11,12],souhait:[3,4,12],souvent:11,split:[4,5],sql:1,sqrt:12,stocker:[4,11],strictement:5,substack:5,succ:6,successeur:6,suffit:6,suit:[3,12],suivant:[3,4,5,6,11,12],sum_:4,sundai:11,suppos:5,supposera:4,supposon:5,supprim:[3,6,12],sur:[3,4,5,11,12],symetriqu:12,t1:5,t2:5,t:[5,6,11],tableau:3,tableaux:4,taill:[3,4,5,6,11,12],tant:12,techniqu:3,tel:[3,4],tell:[3,4,5,12],temp:[3,4,5],termin:6,test:[11,12],tester:[3,5,11,12],text:[4,5,6],textbf:12,texte1:6,texte2:6,thursdai:11,time:[3,4,5,12],total:[4,5,6],tou:12,toujour:5,tout:3,tower:3,tp:18,tr:6,traceback:2,traduct:11,tranch:6,transpose:12,tri:11,tri_poid:5,tri_ratio:5,tri_valeur:5,triangl:4,triant:5,trie:5,trie_add:11,trie_ex:11,trie_ha:11,trie_print:11,trie_siz:11,trier:5,triplet:5,trop:3,trouver:[3,12],tuesdai:11,txt:4,u:[2,6,12],u_0:12,u_:12,u_n:12,un:[2,5,6,11,12,18],underbrac:5,underlin:12,uniform:3,uniqu:12,urllib:4,urlopen:4,utilis:[3,4,5,6,11,12],utilisera:11,v2:5,v:[2,5,6,11,12],v_1:5,v_j:5,v_n:5,va:[4,6,11,12],valabl:[3,12],valeur:[2,3,4,5,11],variabl:[3,12],variat:3,vaut:[4,5],vendredi:11,venon:3,versionn:6,vertic:3,verticaux:3,veut:[3,4],vide:[11,12],visit:12,vo:3,voir:4,voisin:12,votr:[3,12],vou:[3,4,12],vraiment:12,vu:5,w2:5,w:[2,5],w_1:5,w_j:5,w_n:5,wednesdai:11,x:[2,4,11,12,18],y:[3,4,6,11],z:6,zero:3,zeros_lik:3,zone:12},titles:["R\u00e9sum\u00e9 Python","S\u2019entra\u00eener \u00e0 programmer","Programmation dynamique","DM : Redimensionnement d\u2019image par Seam Carving","TP 1 : Programmation dynamique","TP 2 : Probl\u00e8me du sac \u00e0 dos","DS 1 MP* Corrig\u00e9 (X-ENS 2023)","Cours","Exercices","Cours","Exercices","TP : Dictionnaire","TP : R\u00e9visions de 1\u00e8re ann\u00e9e","Cours : Dictionnaire","Exemple : Plus longue sous-suite croissante","Exemple : Algorithmes de plus court chemin","Exercice : Polyn\u00f4mes","Exercice : Chemin dans une matrice","Cours d\u2019informatique commune en 2\u00e8me ann\u00e9e de CPGE au lyc\u00e9e La Martini\u00e8re Monplaisir","Cours","TP","Ressources","Cours : Dictionnaire"],titleterms:{"1":[4,6],"10":6,"11":6,"12":6,"13":6,"14":6,"15":6,"16":6,"17":6,"1\u00e8re":12,"2":[5,6],"2023":6,"2\u00e8me":18,"3":6,"4":6,"5":6,"6":6,"7":6,"8":6,"9":6,"\u00e0":[1,5],"\u00e9l\u00e9ment":11,"\u00e9nergi":3,"\ufb01xe":6,"ann\u00e9":[12,18],"carr\u00e9":4,"corrig\u00e9":6,"di\ufb00\u00e9rentiel":6,"do":5,"enracin\u00e9":11,"entra\u00een":1,"lyc\u00e9":18,"m\u00e9thode":4,"martini\u00e8r":18,"na\u00efv":4,"polyn\u00f4m":16,"pr\u00e9fix":11,"probl\u00e8m":5,"r\u00e9sum\u00e9":0,"r\u00e9vision":12,"repr\u00e9sent":12,"strat\u00e9gi":5,adjac:12,algorithm:[5,15],anagramm:11,arbr:11,au:18,base:12,bellman:2,binomi:4,bonu:3,calcul:3,carv:3,ceux:4,chargement:3,chemin:[2,3,15,17],choisi:5,coeffici:4,commun:18,comparaison:5,cour:[7,9,13,18,19,22],court:[2,15],cpge:18,croissant:14,d:[3,12,18],dan:[4,17],de:[3,4,5,6,12,15,18],dichotomi:12,dictionnair:[11,13,22],dm:3,ds:6,du:[0,5],dynamiqu:[2,3,4,5],en:[6,12,18],enlev:3,exempl:[14,15],exercic:[8,10,11,12,16,17],extrait:0,fini:4,floyd:2,ford:2,glouton:5,gloutonn:5,gradient:3,grand:4,graph:12,i:6,ii:6,imag:3,informatiqu:18,internationalis:11,l:3,la:[5,18],largeur:12,leetcod:1,list:[5,12],longu:14,majoritair:11,matric:[4,12,17],minimum:3,monnai:4,monplaisir:18,mp:6,objet:5,obtenir:5,officiel:0,ont:4,par:[3,6,12],parcour:12,parti:6,plu:[2,4,14,15],posit:6,pour:4,profondeur:12,programm:[0,1,2,3,4,5],python:[0,12],question:[3,4,5,6,12],qui:4,redimensionn:3,rendu:4,ressourc:21,s:1,sac:5,seam:3,solut:[3,4,5,11,12],sou:14,suit:14,sur:6,tp:[4,5,11,12,20],tri:5,trie:11,un:[3,4,17],variabl:6,warshal:2,x:6}})
\ No newline at end of file