動的計画法で碁盤の目の左上から右下への道順を数える

碁盤の目の町を、右か下へ 1 マスずつだけ進んで左上から右下へ行く道順が何通りあるかを数えます。上と左のマスの答えを足して表を埋める、2 次元の動的計画の入口の練習です。

海外で定番の問題リスト 4 本には入っていません

問題

縦 rows マス、横 cols マスの碁盤の目の町があります。配達の人は左上のマスから出発し、右か下へ 1 マスずつだけ進んで、右下のマスへ行きます。道順が何通りあるかを返す関数を書いてください。

  • 左や上へは戻れません。斜めにも進めません
  • 通るマスの並びが違えば、別の道順として数えます
  • rows と cols は 1 以上 100 以下の整数で、答えは 2 × 10^9 以下になるものとします

入力と出力の例

例 1

右へ 3 回、下へ 2 回、合わせて 5 回進みます。5 回のうちどの 2 回を下にするかで、10 通りです。

rows = 3 cols = 4
10

例 2

右、下の順と、下、右の順の 2 通りです。

rows = 2 cols = 2
2

例 3

縦が 1 マスなら、右へまっすぐ進む 1 通りしかありません。

rows = 1 cols = 5
1

面接での聞かれ方

面接では、2 次元の表を埋める動的計画の最初の 1 問として出されます。

  • 「右か下にしか進めないとき、左上から右下への道は何通りありますか」
  • 書き終えると「表を 1 行分の並びに減らせますか?」と続きます
  • 数学の得意な人には「式 1 つで出せますか?」と聞かれることもあります (組み合わせの数で出せます)

続けて「通れないマスがあったら?」と決まりを足されることも多いので、表で埋める書き方を先に身につけておきます。

ヒント

まだ開いていません

付箋は 4 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

アルゴリズムのチートシートの「動的計画法 (DP)」に、この型の要点を表とコードでまとめています。

動的計画法は、途中の答えを覚えておいて、同じ計算をやり直さない書き方です。漸化式で言い直せる問題が多いです。

main.py
def grid_paths(rows: int, cols: int) -> int:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(grid_paths(3, 4))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します