CLRS の INTRODUCTION TO ALGORITHMS で最も長い一般的なサブ シーケンスの問題を経験していましたが、その背後にある思考プロセスを理解できませんでした。説明された他のほとんどの問題は非常に直感的で、将来同様の問題を解決できると確信していますが、最適な部分構造がどのように決定されるかの背後にあるロジックを理解していないため、LCS 問題を視覚化することはできません。
この本は、最適なサブ構造について次の説明を提供します
**定理 15.1 (LCS の最適部分構造)
X == と Y == をシーケンスとし、Z = を X と Y の任意のxm = yn
LCSとする。2. If ,thenは、との LCS であることを意味します。3. If ,thenは、との LCS であることを意味します。証明 (1) の場合、 に追加して長さの共通部分列を得ることができ、との最長共通部分列であるという仮定に反します。したがって、 が必要です。zk = xm = yn
Zk−1
Xm−1
Yn−1
xm != yn
zk = xm
Z
Xm−1
Y
xm != yn
zk = yn
Z
X
Yn−1
zk != xm
xm = yn
Z
X
Y
k + 1
Z
X
Y
zk = xm = yn
さて、接頭辞Zk−1
は と の共通length-(k − 1)
部分列です。それが LCS であることを示したいと思います。矛盾の目的のために、 と の長さが より大きい共通部分列があると仮定します。次に、 に追加すると
、長さが より大きいandの共通部分列が生成されますが、これは矛盾しています。Xm−1
Yn−1
W
Xm−1
Yn−1
k−1
xm = yn
W
X
Y
k
(2) もしzk != xm
,thenZ
が と の共通部分列でXm−1
あるY
. と
の LCS であるという仮定に反して、長さが より大きいとの共通部分列があった場合W
、もと の共通部分列になります。Xm−1
Y
k
W
Xm
Y
Z
X
Y
(3) 証明は (2) と対称です。**
証明は明らかですが、彼らがどのようにして最適な部分構造を思いついたのかわかりません。誰か助けてくれませんか?