グリッドの最短経路(North-East lattice path)の数え上げの例を解説していきます.よくある書き込み(動的計画法)による解法は扱いません.
最短経路の数え上げとは
最短経路の数え上げは,以下のようなグリッド上で左下から右上への最短経路(North-East lattice path)の数を数え上げる問題です.最短経路の例として以下の赤,青の経路があります.
一般的な最短経路
例として,以下の縦
どの最短経路でも上方向に回,右方向に
回移動する必要があります.最短経路の数は「
」
つ,「
」
つを並べる方法の数に等しいです.例えば上の赤の経路は
に対応しています.これは同じものを含む順列の数え上げに等しく,
が答えとなります.ここで,
とは
のことです.
ある点を通る最短経路
グリッド上の最短経路のうち,ある点例えば以下のグリッドの左下から右上への最短経路のうち,赤の点を通るよううなものの数は,です.

点が辺上にあっても数え方は同じで,その辺の両端の点を通るような経路の数を数えればよいです.以下の例で赤の点を通るような物の数は,
です.

ある点を通らない最短経路
全体の経路の数からある点を通る最短経路の数を引けばよい.ある長方形領域を通らない最短経路
以下のようにグリッド上に左上から右下にかけてのオレンジの破線上の点を考えます.このグリッド上の左下から右上への最短経路は必ずオレンジの点を通ります.さらに,異なる2つのオレンジの点を通る最短経路は存在しないため,各オレンジの点を通る最短経路数の総和は,全体の最短経路数と一致します.

以下のようなグリッド上の長方形領域が通れないときの最短経路を数えます.先ほどのように直線を引き,その直線上の各点を通る最短経路数を足せばよいです.

また,このままでは上から2番目のオレンジの点は数えにくいので以下のように直線をずらしてみます.

「異なる2つのオレンジの点を通る最短経路は存在しない」,「各点を通る最短経路数の総和は,全体の最短経路数と一致する」を満たすため,このように変形しても問題ないです.
この場合の最短経路数はとなります.
一般に,長方形領域が通れない場合,その長方形の頂点から引いた直線を引くとこのように求めることができます.
ある直線を跨がない最短経路
傾き1の直線を跨がない最短経路(直線1本)
以下のようなグリッド上の直線を跨がない(直線上の点は通ってもよい)最短経路の数を数えます.

この直線を跨がないということは以下の灰色の直線上の点を通らないということになります.

このグリッドをこの通ってはいけない灰色の直線で折り返すと以下のようになります.数えたいものは黒点から赤点まで灰色の点を通らずに行く最短経路数です.これは「黒点から赤点までの最短経路数」から「黒点から赤点までで灰色の点を通るような最短経路数」を引けば良いです.ここで,「黒点から赤点までで灰色の点を通るような最短経路数」というのは「黒点から青点までの最短経路数」と等しいです.なぜならば,「黒点から青点までの最短経路」は必ず1度は灰色の点を通り,そのうち初めに通った灰色の点以降の経路を直線で折り返すと「黒点から赤点までで灰色の点を通るような最短経路」と1対1対応するからです.

例えば以下の赤の経路と青の経路が対応します.

この場合の最短経路数はとなります.
一般に,縦区画,横
区画のグリッドの上から
区画にかけて以下のように直線がある場合,その直線上の点を跨がない最短経路の数は,
となります.

特に,の場合,この値はカタラン数と呼ばれ,
と表されます.
傾き1の直線を跨がない最短経路(直線2本)
下図のように複数の直線があっても複数回折り返すことで同じように解くことができます.

(黒赤)
(黒
青)
(黒
黄)
(黒
緑)が答えとなります.ただし,直線の位置によっては多くの回数折り返す必要がある場合があります.

一般に,縦区画,横
区画のグリッドの上から
区画,下から
区画にかけて以下のように直線がある場合,その直線を跨がない最短経路の数は,
として,
となります.

傾き1の2本の直線の間を通る最短経路
となることが知られています.*1
傾き1の直線を通らない最短経路(直線2本)はこれの特殊な例となっています.
傾き1/μの直線を跨がない最短経路
もしくは
となることが知られています.*2
特に,のとき,
となります.
傾きq/pの直線を跨がない最短経路
となることが知られています.*3
とすることで,カタラン数になることも確認できます.
また,この直線より上側にある「経路上の格子点」の数が個(
)であるような経路数も同様に
となります(の値によらない).より一般的な場合も計算できますが,効率的な計算方法は分かっていないようです.*4
対角線上を
回通る最短経路
縦横
対角線上の点のうち通るものを決めると,点と点の間は「対角線上の(始点と終点を除く)点を通らない最短経路数を求めよ.」という複数の部分問題に分割できます.下図のうち,オレンジの点が通る点,青の枠が部分問題になっています.

「縦横区画のグリッドの左下から右上への最短経路のうち,グリッドの対角線上の(始点と終点を除く)点を通らないものの数を求めよ.」という部分問題の解を求めます.これは簡単で,下図において,左下の赤(青)点から右上の赤(青)点まで対角線(オレンジ)を通らない最短経路の数を求めればよいです.ある直線を跨がない最短経路で紹介したカタラン数を用いて
と表すことができます.

あとは,サイズの和がになるような部分問題の積の和を求めればよいです(畳み込み).
はカタラン数の畳み込みになっていて,この値は
であることが知られています.*5*6
したがって,となります.
対角線の下側しか通れないという制約が付いても,部分問題の解がとなるだけなので
です.
この制約が付いた数え上げ問題ははカタラン数の畳み込みに帰着させる方法の他にも,下図のある直線を跨がない最短経路と一対一の対応をさせることでも求めることができます.ただし,「ある直線を跨がない最短経路」で説明したような直感的で簡潔な証明が分からないので省略します.

回曲がる最短経路
右折が
回ある最短経路
下図のような縦
右折する地点を以下の青の点から個選べば最短経路が一意に定まります.ただし,
点は左下から右上に並ぶように選ぶ必要があります(縦横に同じ列に2点や,点の左上の領域に点が存在してはいけません).

これは,下図の左の矢印から個,下の矢印から
個選ぶことによって条件を満たす点を選ぶことができます.

例えば,最初の例に示した最短経路を選ぶ方法は下図のようになります.

したがって,このような経路数はとなります.
形式的冪級数による解釈
最初に右に0回以上進み,右折を回行って,最後に上に0回以上進む.
としたときのが求める値.
なので
となる.
右左折が
回ある最短経路
右折(
まず,始点から最初に上(

例えば,最初の例に示した最短経路を選ぶ方法は下図のようになります.

したがって,経路数はとなります.
左折が
回ある対角線を跨がない最短経路
縦横下図はの経路の例です.

ここで,下図のように右へ進む場合と上へ進む場合を色分けして同じ色が連続している数を書いてみます.

右へ連続して進む区間と上へ連続して進む区間が交互に回ずつ出現することがわかります.
番目に出現する「右へ連続して進む区間」の右に進む回数を
とします.上へ進む場合も同様にして数列
を定義します.
上図の例だととなります.
整数列の条件は
となりますが,3番目の条件は無視すると数列は,縦
区画,横
区画のグリッドの最短経路と対応が取れます.
具体的には,先ほどのは以下の最短経路と対応が取れます.縦に
本の経路がありますが,右から
番目の経路では上へ
回進んでいます.
右側の数列の例では,まず
回上へ進んで右へ
回進み,
回上へ進んで右へ
回進み,
回上へ進んでいます.

ここで3番目の条件 を考えると,このグリッドの経路上において数列
を表す最短経路が数列
を表す最短経路の上に来ないことが条件であることがわかります.

これで交差しない最短経路の組で扱う問題と同じになったためLGV公式を用いて求めるととなります.これはNarayana数として知られています.
左折が
回ある直線を跨がない最短経路
より一般に,以下のように縦
左折がK回ある対角線を跨がない最短経路では,最初に右,最後に上に進むしかないため考えやすくなっていましたが,今回はそうではありません.
そこで,簡単に考えるために最初は右()に,最後は上(
)に進む場合の経路数
を数えます.
左折がK回ある対角線を跨がない最短経路と同様に考えると,以下の数列に対応付けられます.
これは,下図のグリッド上の同色点間の最短経路の組であって,青点間の最短経路が赤点間の最短経路の上に来ないようなものの数となります.

LGV公式を用いると,
となります(ただし,).
次に,最初は右(),最後は右(
)に進む場合の経路数
を数えます.
終点まで進んだ後に上に移動することにすると下図のグリッド上で「最初は右(
)に,最後は上(
)に進む場合の経路」として数えることができます(最後の
により
が
増えることに注意).

ただし,このままでは下図のような経路も含まれてしまうのでこれらを引く必要があります.

は
であるので,
を求めます.下図は最初は上に
進み,最後は右に
進んだ場合の経路を表しています.

最初のステップと最後の
ステップを除くと
となります.
これまでの結果をまとめると以下のようになります.
したがって,求める最短経路数はこれらの和なので,
となります.
右折が
回ある直線を跨がない最短経路
同様に右折が最初が右(),最後が上(
)となる最短経路において,右折回数を
とすると左折回数は
となります.
最初が右(),最後が右(
)となる最短経路において,右折回数を
とすると左折回数は
となります.
最初が上(),最後が上(
)となる最短経路において,右折回数を
とすると左折回数は
となります.
最初が上(),最後が右(
)となる最短経路において,右折回数を
とすると左折回数は
となります.
以上から,
となります.
右左折が
回ある直線を跨がない最短経路
同様に右左折が最初が右(),最後が上(
)となる最短経路において,右左折回数を
とすると左折回数は
となります.(
は奇数)
最初が上(),最後が右(
)となる最短経路において,右左折回数を
とすると左折回数は
となります.(
は奇数)
最初が右(),最後が右(
)となる最短経路において,右左折回数を
とすると左折回数は
となります.(
は偶数)
最初が上(),最後が上(
)となる最短経路において,右左折回数を
とすると左折回数は
となります.(
は偶数)
以上から,
複数の最短経路数の和
複数の点間の最短経路数の和は一つずつ求めずとも簡単に求まる場合があります.ここでは,そのような例について見ていきます.対角線上の点までの最短経路
下図のような縦横
この例では,最短経路数は左上の点から順になので答えは
です.
一般に,二項定理よりであるので,総和は
になります.
傾き-q/pの直線上の点までの最短経路
さらに一般化して,左下を原点,右を軸正の方向,上を
軸正の方向とする平面の
(
は互いに素)の直線上にある格子点までの最短経路数の総和を求めます.
下の図はの例です.

結論のみ書きますが,形式的冪級数を用いて、
となります.の場合,対角線上の点までの最短経路の例のように
となることが分かります.
さらに,これを拡張して,直線を右にずらし,点
を端点とする半直線上の格子点までの最短経路数の総和を考えます.以下は
の場合の例です.

これは累積和を回取るだけなので,
と表されます.
グリッドの端の点までの最短経路
下図のような縦
ここでグリッドの区画を右に増やします.そして各点を右の辺上に移動させます.このグリッドでの左下の点(黒)から各点(オレンジ)までの最短経路数の総和は元のグリッドでの最短経路数の総和と同じです.さらに,左下の点から右上の点(黒)への最短経路は必ずオレンジの点をただ一つ通るので,求める最短経路数の総和はこのグリッドでの左下の点から右上の点への最短経路数の総和と一致します.したがって,が答えとなります.

経路の上側の面積がKとなる最短経路
以下のように、赤い経路に対して,経路の上側の色が塗られたマスの数のことを,赤い経路に対する上側の面積とします.この例の場合,面積は
縦横
のグリッドで上側の面積が
となるような最短経路の数は,簡単な対応付けにより「
を
個以下の"
以下の非負整数"に分割する方法の数」であることが分かります.*8
単純な動的計画法ではかかりますが,q二項係数と形式的冪級数を利用すると
で求めることができます.(問題例のところに問題(Mojacoder)置いてます)
交差しない最短経路の組
縦ただし,つの最短経路が交差するとは,以下のような状態のことを指すものとし,

以下のような不完全な交差(重なっているだけで上下が入れ替わっていないもの)は考えないものとします.

のケースを用いて説明します.
以下のように最短経路をスライドすることによって,どのつの最短経路も重なっていないようなものを数え上げる問題になります.

この問題はLGV公式を用いて解くことができ,答えは
となり,
より詳しい解説はこの記事を参照してください.
ある領域を通らない最短経路
下図のような縦
を「上に
,右に
進んだ場所までの経路数」としたとき,単純な遷移では
かかってしまいます.
通れる領域を真ん中付近で分割し,再帰的に求めていくことを考えます.以下のように,赤枠の部分を境目にしてオレンジの部分と水色の部分に分割されます.

オレンジの部分を再帰的に求めた後,以下の赤点の値が求まっています.赤点群の値から黄点群の値を求めることを考えます.詳しいことは書きませんが(TODO:書く),畳み込みができる形になっているため,分割統治FFTの要領でで求めることができます.

左上だけでなく右下の領域も通れない場合は

以下のように領域を分割することで先程と同様に求めることができます.

ちなみに,これは簡単な対応付けにより以下のような問題に言い換えることができます.
を満たす長さ
の広義単調増加整数列
の数を求めよ.
であっても
としても問題ないので以下の問題も同様に解けます.
問題例
- ARC058 B
- ABC154 F
- ABC205 E
- yukicoder 0660
- AGC070 C
- yukicoder 1662
- yukicoder 1989
- yukicoder 2199
- yukicoder 2872 ボーナス
- MojaCoder
- HUPC2023Day1 L
- CCPC I
*1:https://arxiv.org/pdf/1503.05930.pdf
*2:https://arxiv.org/pdf/1503.05930.pdf
*3:https://arxiv.org/pdf/1503.05930.pdf
*4:https://arxiv.org/abs/2406.09590v1
*5:Alon Regev, "A proof of Catalan’s Convolution formula", (2011).
*6:Dardy, "[Tutorial] Catalan Numbers and Catalan Convolution".
*7:Counting lattice paths by crossings and major index I: the corner-flipping bijections