アルゴリズムと計算量の問題
文字列 から 個以上の文字を取り除き、残った文字を元の順に並べて得られる文字列を の部分列という(取り除く文字は連続していなくてよい)。 つの文字列の両方の部分列であるものを共通部分列といい、共通部分列のうち長さが最大のものを最長共通部分列という。
つの DNA 塩基配列を表す文字列
の最長共通部分列の長さを求めよ。
この問題で使うもの
- 最長共通部分列(説明と入口の問題)
この問題を解けるようになるまで(2 技能)
読み込み中…
右端(太枠)がこの問題で使う技能です。左へドラッグすると、さらに前の前提をさかのぼれます。技能を押すと、そこまでの道筋が光ります。
一覧で見る(前提が先)
ヒント
行き詰まったら、上から順に 1 つずつ開いてください。
ヒント 1
最長共通部分列の表 ( の先頭 文字と の先頭 文字の最長共通部分列の長さ)を動的計画法で埋める技能を使う。
ヒント 2
なら 、そうでなければ 。 から始める。
ヒント 3
行目(G)は 、 行目(A)は 、 行目(T)は になる。残りの 行を同じように埋め、右下の値を読む。
答えと解説
答えを見る
どこでつまずきましたか?(選ぶと、戻る場所を案内します)
解説を読む
、 とし、 を「 の先頭 文字と の先頭 文字の最長共通部分列の長さ」とする。
初期値: 一方が空文字列なら共通部分列は空文字列だけなので、。
漸化式: のとき
これを の行から順に、各行は左から右へ埋める(上・左・左上の値がすでに求まっているので計算できる)。
- (): で一致して 。それより左は 、右は で 。行は 。
- (): は 。(A)一致で 。 は で 。(A)一致で 。行は 。
- (): (T)一致で 。 は で 。 は 。行は 。
- (): は で 。(C)一致で 。 は で 。行は 。
- (): は 。(A)一致で 。 は で 。(A)一致で 。行は 。
表にまとめると(行が 、列が )
右下の値 が答えである。実際、(あるいは )は の両方の部分列になっている。
答え:
別解
長さ 3 の共通部分列として TCA がある。X = GATCA では 3, 4, 5 文字目、Y = TACGA では 1, 3, 5 文字目として取り出せる。
長さ 4 の共通部分列がないことを確かめる。X の長さ 4 の部分列は、1 文字を取り除いた次の 5 通りしかない。
- ATCA(G を除く)
- GTCA(2 文字目の A を除く)
- GACA(T を除く)
- GATA(C を除く)
- GATC(最後の A を除く)
Y = TACGA について、それぞれ部分列かどうかを調べる。
- ATCA: A(2 文字目) の後に T がないので、部分列でない。
- GTCA: G(4 文字目) の後に T がないので、部分列でない。
- GACA: G(4 文字目)、A(5 文字目) の後に C がないので、部分列でない。
- GATA: G、A の後に T がないので、部分列でない。
- GATC: A の後に T がないので、部分列でない。
どれも Y の部分列でないので、長さ 4 以上の共通部分列は存在しない。したがって最長共通部分列の長さは 3 である。