|
64 | 64 | },
|
65 | 65 | {
|
66 | 66 | "cell_type": "code",
|
67 |
| - "execution_count": 17, |
| 67 | + "execution_count": 31, |
68 | 68 | "metadata": {},
|
69 | 69 | "outputs": [
|
70 | 70 | {
|
|
228 | 228 | },
|
229 | 229 | {
|
230 | 230 | "cell_type": "code",
|
231 |
| - "execution_count": 25, |
| 231 | + "execution_count": 32, |
232 | 232 | "metadata": {},
|
233 | 233 | "outputs": [
|
234 | 234 | {
|
|
282 | 282 | " rec[i][j] = \"LU\"\n",
|
283 | 283 | " return D[n][m], rec\n",
|
284 | 284 | "\n",
|
285 |
| - "\n", |
286 | 285 | "if __name__ == '__main__':\n",
|
287 | 286 | " s1 = \"kittcjen\"\n",
|
288 | 287 | " s2 = \"kitchen\"\n",
|
289 | 288 | " ans, rec = minimal_edit_distance(s1, s2)\n",
|
290 | 289 | " print_MED(rec, s1, s2, len(s1), len(s2))"
|
291 | 290 | ]
|
| 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 | + ] |
292 | 477 | }
|
293 | 478 | ],
|
294 | 479 | "metadata": {
|
|
0 commit comments