パズルの国のアリス

赤白のポーンたちの写真撮影(解答)

 最初の「長さ5の単調部分列を含まないように16人を並べる」問題は,いきなり答えを与えて,読者のみなさんにそれを検証していただこう。

 ポーンを身長の小さいほうから順にP1P2,…,P16とすると,例えばP4P3P2P1P8P7P6P5P12P11P10P9P16P15P14P13と並べると,長さ5の単調部分列を含まない。他の並べかたもあるが,一般にn2人の場合,このように身長順にn人ずつn個のグループを作って同様に並べれば,それが長さn+1の単調部分列を含まないことは納得していただけるだろう。

 逆にmn2のとき,m人を並べて長さn+1の単調部分列を含まないようにすることは,全員の身長が異なれば不可能である。よって,m=17で全員の身長が異なれば,長さ5の単調部分列を必ず含むことになる。これを証明するのが次の問題だ。

 それがなぜかを考えるには,任意に与えられた数列a1a2,…,amの中から最長の単調部分列とその長さを探し出すアルゴリズムの1つが参考になるかもしれない。それは次のようなものである。左からk番目の要素が最後になるような最長の増加部分列の長さをUk)と書き,同様に左からk番目の要素が最後になるような最長の減少部分列の長さをDk)と書こう。このときUk)とDk)は帰納的に次のように計算できる。

Uk)=max{Ui)|ikかつaiak}+1
Dk)=max{Di)|ikかつaiak}+1

ただしとする。従ってU(1)=D(1)=1である。このアルゴリズムのアイデアは難しくはない。例えばUで説明すると,akより左に列を探しにいき,aiakUi)が最大のものがあれば,長さUi)の増加部分列atas<…<aits<…<i)が存在するから,その後ろにakをくっつけて,長さUi)+1の増加部分列atas<…<aiakを作るというものだ。Dも同様である。

 Uk)とDk)をすべてのk=1,…,mについて計算してしまえば,問題の最長の単調部分列を見つけだすには,その中から最大のUk)またはDk)を取り,それが示す増加部分列または減少部分列を取り出せばよい。

 このアルゴリズムは,素朴に実装しても,記憶容量はmに比例する量,計算時間はm2に比例する時間で実行できるから,悪くないものだ。この種の「元の問題をよりサイズの小さい部分問題に帰着し,その結果を記録しておいて,それを利用して元の問題を解く」という形になっているアルゴリズムは,一般に「動的計画法」と呼ばれ,計算機で問題を解く場合の常套手段の1つになっている。最長の単調部分列を見つけるためのアルゴリズムは,動的計画法の代表例といえよう。

 ちなみに,このアルゴリズムを先のポーン列P4P3P2P1P8P7P6P5P12P11P10P9P16P15P14P13に適用すると,下の表のようになり,Uk)とDk)のどこにも5以上の数値は現れないから,長さ5の単調部分列は含まれていないことがわかる。

 さて,異なる数値からなる列は,n2よりも長ければ,nよりも長い単調部分列を必ず含むが,そのことへのヒントは,上の表のUDを眺めていれば気づくかもしれない。ポイントはjkなる2つのインデックスjkを見た場合,Uj)<Uk)またはDj)<Dk)が成り立つことである。少し考えてみれば,これは当たり前だ。ajakだから,ajakまたはajakだが,定義より前者ならばUj)<Uk)だし,後者ならばDj)<Dk)である。

 以上から,異なるjkに対してUj)=Uk)かつDj)=Dk)となることはないことがわかる。もしD(1),U(1),D(2),U(2),…,Dm),Um)の中にnよりも大きい数が現れなければ,Dk)もUk)も1,2,…,nのどれかということになる。しかし,対(Dk),Uk))の可能性はn2種類しかない。従って,mn2ならば,ある異なるjkがあって,Uj)=Uk)かつDj)=Dk)ということになり,上でみてきたことに反する。

問題はこちらです