Skip to content

Commit 5ae6d2e

Browse files
committed
add algo6.6~6.9
1 parent d776bfd commit 5ae6d2e

File tree

1 file changed

+188
-3
lines changed

1 file changed

+188
-3
lines changed

第六章代码.ipynb

+188-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
},
6565
{
6666
"cell_type": "code",
67-
"execution_count": 17,
67+
"execution_count": 31,
6868
"metadata": {},
6969
"outputs": [
7070
{
@@ -228,7 +228,7 @@
228228
},
229229
{
230230
"cell_type": "code",
231-
"execution_count": 25,
231+
"execution_count": 32,
232232
"metadata": {},
233233
"outputs": [
234234
{
@@ -282,13 +282,198 @@
282282
" rec[i][j] = \"LU\"\n",
283283
" return D[n][m], rec\n",
284284
"\n",
285-
"\n",
286285
"if __name__ == '__main__':\n",
287286
" s1 = \"kittcjen\"\n",
288287
" s2 = \"kitchen\"\n",
289288
" ans, rec = minimal_edit_distance(s1, s2)\n",
290289
" print_MED(rec, s1, s2, len(s1), len(s2))"
291290
]
291+
},
292+
{
293+
"cell_type": "markdown",
294+
"metadata": {},
295+
"source": [
296+
"## 算法 6.6"
297+
]
298+
},
299+
{
300+
"cell_type": "code",
301+
"execution_count": 1,
302+
"metadata": {},
303+
"outputs": [
304+
{
305+
"name": "stdout",
306+
"output_type": "stream",
307+
"text": [
308+
"2\n",
309+
"[['L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'], ['U', 'LU', 'L', 'L', 'L', 'L', 'L', 'L'], ['U', 'U', 'LU', 'L', 'L', 'L', 'L', 'L'], ['U', 'U', 'U', 'LU', 'L', 'L', 'L', 'L'], ['U', 'U', 'U', 'U', 'LU', 'L', 'L', 'L'], ['U', 'U', 'U', 'U', 'LU', 'L', 'L', 'L'], ['U', 'U', 'U', 'U', 'U', 'LU', 'L', 'L'], ['U', 'U', 'U', 'U', 'U', 'U', 'LU', 'L'], ['U', 'U', 'U', 'U', 'U', 'U', 'U', 'LU']]\n"
310+
]
311+
}
312+
],
313+
"source": [
314+
"def MED_scrolling_array(s : str, t : str):\n",
315+
" n = len(s)\n",
316+
" m = len(t)\n",
317+
" D = [[0 for _ in range(m + 1)] for __ in range(m + 1)]\n",
318+
" rec = [[0 for _ in range(m + 1)] for __ in range(n + 1)]\n",
319+
" for i in range(n + 1):\n",
320+
" rec[i][0] = \"U\"\n",
321+
" for j in range(m + 1):\n",
322+
" D[0][j] = j\n",
323+
" rec[0][j] = \"L\"\n",
324+
" \n",
325+
" for i in range(1, n + 1):\n",
326+
" id = i & 1\n",
327+
" D[id][0] = i\n",
328+
" for j in range(1, m + 1):\n",
329+
" ansDel = D[id ^ 1][j] + 1\n",
330+
" ansIns = D[id][j - 1] + 1\n",
331+
" ansRep = D[id ^ 1][j - 1] + (0 if s[i - 1] == t[j - 1] else 1)\n",
332+
" D[id][j] = min(ansDel, ansIns, ansRep)\n",
333+
" if D[id][j] == ansDel:\n",
334+
" rec[i][j] = \"U\"\n",
335+
" elif D[id][j] == ansIns:\n",
336+
" rec[i][j] = \"L\"\n",
337+
" else:\n",
338+
" rec[i][j] = \"LU\"\n",
339+
" return D[n & 1][m], rec\n",
340+
"\n",
341+
"if __name__ == '__main__':\n",
342+
" s1 = \"kittcjen\"\n",
343+
" s2 = \"kitchen\"\n",
344+
" ans, rec = MED_scrolling_array(s1, s2)\n",
345+
" print(ans)\n",
346+
" print(rec)"
347+
]
348+
},
349+
{
350+
"cell_type": "markdown",
351+
"metadata": {},
352+
"source": [
353+
"## 算法 6.7"
354+
]
355+
},
356+
{
357+
"cell_type": "code",
358+
"execution_count": 3,
359+
"metadata": {},
360+
"outputs": [
361+
{
362+
"name": "stdout",
363+
"output_type": "stream",
364+
"text": [
365+
"27\n",
366+
"[2, 2, 6]\n"
367+
]
368+
}
369+
],
370+
"source": [
371+
"def rod_cutting(p, n):\n",
372+
" dp = [0 for _ in range(n + 1)]\n",
373+
" rec = [0 for _ in range(n + 1)]\n",
374+
" dp[0] = 0\n",
375+
" for i in range(1, n + 1):\n",
376+
" best = i\n",
377+
" for j in range(1, i):\n",
378+
" if p[best] + dp[i - best] < p[j] + dp[i - j]:\n",
379+
" best = j\n",
380+
" dp[i] = dp[i - best] + p[best]\n",
381+
" rec[i] = best\n",
382+
" \n",
383+
" solution = []\n",
384+
" p = n\n",
385+
" while p != 0:\n",
386+
" solution.append(rec[p])\n",
387+
" p -= rec[p]\n",
388+
"\n",
389+
" return dp[n], solution\n",
390+
"\n",
391+
"if __name__ == '__main__':\n",
392+
" p = [0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 24]\n",
393+
" n = 10\n",
394+
" ans, solution = rod_cutting(p, n)\n",
395+
" print(ans)\n",
396+
" print(solution)"
397+
]
398+
},
399+
{
400+
"cell_type": "markdown",
401+
"metadata": {},
402+
"source": [
403+
"## 算法 6.8"
404+
]
405+
},
406+
{
407+
"cell_type": "code",
408+
"execution_count": 12,
409+
"metadata": {},
410+
"outputs": [
411+
{
412+
"name": "stdout",
413+
"output_type": "stream",
414+
"text": [
415+
"2800\n"
416+
]
417+
}
418+
],
419+
"source": [
420+
"def chain_of_matrix(p):\n",
421+
" n = len(p) - 1\n",
422+
" dp = [[(-1 if i != j else 0) for j in range(n + 1)] for i in range(n + 1)]\n",
423+
" for l in range(2, n + 1):\n",
424+
" for i in range(1, n - l + 2):\n",
425+
" j = i + l - 1\n",
426+
" for k in range(i, j):\n",
427+
" cur = dp[i][k] + dp[k + 1][j] + p[i - 1] * p[k] * p[j]\n",
428+
" if dp[i][j] == -1 or cur < dp[i][j]:\n",
429+
" dp[i][j] = cur\n",
430+
" rec[i][j] = k\n",
431+
" return dp[1][n], rec\n",
432+
"\n",
433+
"\n",
434+
"if __name__ == '__main__':\n",
435+
" p = [40, 8, 30, 5]\n",
436+
" n = 3\n",
437+
" ans, rec = chain_of_matrix(p)\n",
438+
" print(ans)"
439+
]
440+
},
441+
{
442+
"cell_type": "markdown",
443+
"metadata": {},
444+
"source": [
445+
"## 算法 6.9"
446+
]
447+
},
448+
{
449+
"cell_type": "code",
450+
"execution_count": 30,
451+
"metadata": {},
452+
"outputs": [
453+
{
454+
"name": "stdout",
455+
"output_type": "stream",
456+
"text": [
457+
"(M1)((M2)(M3))\n"
458+
]
459+
}
460+
],
461+
"source": [
462+
"def print_matrix_chain(rec, U, n, i, j):\n",
463+
" if i == j:\n",
464+
" return U[i - 1]\n",
465+
" left = print_matrix_chain(rec, U, n, i, rec[i][j])\n",
466+
" right = print_matrix_chain(rec, U, n, rec[i][j] + 1, j)\n",
467+
" return ''.join(['(', left, ')(', right, ')'])\n",
468+
"\n",
469+
"if __name__ == '__main__':\n",
470+
" p = [40, 8, 30, 5]\n",
471+
" n = 3\n",
472+
" ans, rec = chain_of_matrix(p)\n",
473+
" U = [\"M1\", \"M2\", \"M3\"]\n",
474+
" solution = print_matrix_chain(rec, U, n, 1, n)\n",
475+
" print(solution)"
476+
]
292477
}
293478
],
294479
"metadata": {

0 commit comments

Comments
 (0)