怠惰なラケットで動的プログラミングを行う方法を覚えようとしています。Project Eulerの問題の1つを解決した後、私はこれを疑問に思い始めました:
下の三角形の上部から始めて、下の行の隣接する数字に移動すると、上から下までの最大合計は 23 になります。
3 7 4 2 4 6 8 5 9 3
つまり、3 + 7 + 4 + 9 = 23 です。
下の三角形の上から下までの合計の最大値を求めてください: ...
以下のコードで解決しました。しかし、私は学校でレイジー ラケット (および実際にはプログラミング言語全般) について教えられました。レイジー言語では、動的プログラミングの問題を解決する方がはるかに簡単であることを覚えているようです。たとえば、他のユーラー主義者が投稿した解決策では、問題を解決するために使用した haskell コードを投稿しましたが、問題のデータを実際に指定するのにかかったコードはわずか 1 行でした (三角形の中にあるもの)。自体)。しかし、私はコードを理解していなかったので、まだ混乱しています。
概要:
- 怠惰なラケットで動的プログラミングの問題をどのように解決しますか? 例として、答えは上記のように(完全な15レベルの三角形ではなく)4レベルの三角形の例を解決するか、以前に作成された編集距離コードを投稿する可能性があります(これが私がDPを学んだ方法です)。
- レイジー言語 (レイジーラケットなど) で動的プログラミングを行う方が簡単なのはなぜですか?
通常のラケットの DP 問題を解決するために使用した 80 行のコードを以下に示します。
#lang racket
(define (triangle-ref x y)
(let ((triangle
(vector-immutable
(vector-immutable 04 62 98 27 23 09 70 98 73 93 38 53 60 04 23)
(vector-immutable 63 66 04 68 89 53 67 30 73 16 69 87 40 31)
(vector-immutable 91 71 52 38 17 14 91 43 58 50 27 29 48)
(vector-immutable 70 11 33 28 77 73 17 78 39 68 17 57)
(vector-immutable 53 71 44 65 25 43 91 52 97 51 14)
(vector-immutable 41 48 72 33 47 32 37 16 94 29)
(vector-immutable 41 41 26 56 83 40 80 70 33)
(vector-immutable 99 65 04 28 06 16 70 92)
(vector-immutable 88 02 77 73 07 63 67)
(vector-immutable 19 01 23 75 03 34)
(vector-immutable 20 04 82 47 65)
(vector-immutable 18 35 87 10)
(vector-immutable 17 47 82)
(vector-immutable 95 64)
(vector-immutable 75))))
(vector-ref (vector-ref triangle y) x)))
(define triangle-size 15)
(define (problem18)
(let ((table (let fill-table ((table (hash))
(current-x 0)
(current-y 0))
(cond ((>= current-y triangle-size) table)
((>= current-x (- triangle-size current-y))
(fill-table table 0 (add1 current-y)))
(else (let ((reference (cons current-x current-y))
(triangle-value (triangle-ref current-x
current-y)))
(if (= current-y 0)
(fill-table (hash-set table
reference
(cons triangle-value
empty))
(add1 current-x)
current-y)
(let* ((left-entry (hash-ref
table
(cons
current-x
(sub1 current-y))))
(left-cost (car left-entry))
(left-path (cdr left-entry))
(right-entry (hash-ref
table
(cons
(add1
current-x)
(sub1
current-y))))
(right-cost (car right-entry))
(right-path (cdr right-entry)))
(if (> left-cost right-cost)
(fill-table (hash-set table
reference
(cons
(+ triangle-value
left-cost)
(cons
triangle-value
left-path)))
(add1 current-x)
current-y)
(fill-table (hash-set table
reference
(cons
(+ triangle-value
right-cost)
(cons
triangle-value
right-path)))
(add1 current-x)
current-y))))))))))
(car (hash-ref table (cons 0 (sub1 triangle-size))))))
(problem18)
(provide problem18)