1. 3 x 7 -> 28
  2. 3 x 2 -> 3
  3. 7 x 3 -> 28
  4. 3 x 3 -> 6
  5. 1 x 1 -> 1
  6. 10 x 10 -> 48620
コース一覧
コンピューターサイエンス上級:アルゴリズムとデータ構造
グリッド経路数 (Unique Paths)

コンピューターサイエンス上級:アルゴリズムとデータ構造

探索、ソート、木、グラフ、動的計画法、貪欲法など、競技プログラミングや技術面接で問われる高度なアルゴリズムとデータ構造を学べるコースです。基本的な CS の知識を持ち、アルゴリズム力を伸ばしたい学習者や、外資・大手の技術面接対策をしたい方を対象としています。約 13 時間 (1 日 30 分 × 26 日) で 50 レッスンを修了でき、修了後はコーディング面接の実装問題を構造的に解けるようになります。

1
連結リスト
01. リンクリスト構築と長さの計算5分
02. リンクリストの反転5分
03. リンクリストのサイクル検出5分
04. ソート済みリンクリストの merge5分
05. リンクリストの中央ノード取得5分
06. ソート済みリストの重複削除5分
07. 第1章まとめクイズ5分
2
二分木
01. 二分木の in-order 走査5分
02. 二分木の pre-order 走査5分
03. 二分木の post-order 走査5分
04. 二分木の幅優先走査 (BFS)5分
05. 二分木の高さ5分
06. 二分木の平衡判定5分
07. 第2章まとめクイズ — 二分木5分
3
探索木 (BST)
01. BST に値を挿入する5分
02. BST から値を検索する5分
03. BST の最小値と最大値5分
04. BST 妥当性チェック5分
05. BST で k 番目に小さい値5分
06. BST から値を削除する5分
07. 第 3 章 まとめクイズ5分
4
ハッシュとセット
01. hashmap で頻度集計5分
02. キーでグループ化5分
03. two sum (hash で O(n))5分
04. 部分配列の和 = k の個数5分
05. 最長連続部分列5分
06. 集合の積 (intersection)5分
07. 第4章まとめクイズ5分
5
グラフ
01. グラフ BFS で連結成分サイズを求める5分
02. グラフ DFS で連結成分の数を数える5分
03. グラフのパス存在判定5分
04. BFS で最短経路の長さを求める5分
05. トポロジカルソート5分
06. 2 部グラフ判定5分
07. ダイクストラ法 — 重み付きグラフの最短経路15分
08. 第5章まとめクイズ — グラフ5分
6
動的計画法 (上級)
01. 編集距離 (レーベンシュタイン距離)5分
02. 最長増加部分列(LIS)の解法 ── AOJ 2430 対応の動的計画法5分
03. 最大部分配列和 (Kadane)5分
04. 隣り合わない最大値 (House Robber)5分
05. グリッド経路数 (Unique Paths)5分
06. 単語分割可能か (Word Break)5分
07. 第6章まとめクイズ — 動的計画法 (上級)5分
7
総合データ構造と関数型
01. map と filter を組み合わせる5分
02. reduce で積を計算5分
03. 関数合成5分
04. カリー化5分
05. trie の単純検索 (prefix マッチ)5分
06. Union-Find (連結成分数)5分
07. 最終総まとめクイズ5分

グリッド経路数 (Unique Paths)

道順を手で数えると、漏れる

碁盤の目のような街を、左上から右下まで歩きます。進めるのは右か下だけ。行き方は何通りあるでしょうか。

2 行 3 列くらいなら、指でなぞって数えられます。3 行 7 列で 28 通り。10 行 10 列だと 4 万 8 千通りを超えます。もう手では数えられませんし、1 本ずつなぞって数える方法はプログラムにしても遅すぎます。同じ道の途中を、別の道の一部として何度もなぞり直すことになるからです。

なぞらずに数える手があります。

上から来た数と、左から来た数を足す

あるマスに立っているとき、そこへ来る直前にいた場所は 2 つしかありません。すぐ上のマスか、すぐ左のマスです。右か下にしか進めないので、それ以外からは来られません。

ということは、そのマスまでの行き方の数は、上のマスまでの行き方の数と、左のマスまでの行き方の数を足したものになります。なぞる必要はなく、足し算だけで進みます。

一番上の行と一番左の列は、どのマスも 1 です。上の行はずっと右に進む一本道、左の列はずっと下に進む一本道しかないからです。

3 行 4 列で、左上から順に埋めてみます。

1 列目2 列目3 列目4 列目
1 行目1111
2 行目1234
3 行目13610

右下の 10 が答えです。2 行 2 列目の 2 は、上の 1 と左の 1 を足したもの。3 行 3 列目の 6 は、上の 3 と左の 3 を足したものです。パスカルの三角形を斜めに寝かせた形になっています。

表全体を 1 で埋めてから始めると、端の初期化を別に書かなくて済みます。

Python

grid = [[1] * 4 for _ in range(3)] # 3 行 4 列を 1 で埋める

ここを 0 で作ってしまうと、端が 0 のまま足し算が進み、右下まで 0 のままになります。埋める順番も大事で、上の行から順に、行の中は左から右へ進みます。逆に回すと、まだ埋めていない値を足すことになります。

前の行しか使わない

足すのは「上」と「左」だけで、2 行以上前の値は使いません。ということは、表を丸ごと持たなくても 1 行ぶんの配列で足ります。左から右へ上書きしていくと、まだ書き換えていない位置には上の行の値が、直前に書き換えた位置には左の値が入っているからです。

この「必要な過去だけ持つ」考え方は、前のレッスンの変数 2 つと同じ発想です。まずは表をそのまま作って正しく動かし、動いてから減らすのが安全です。順番を 1 つ間違えるだけで静かに違う答えを返すので、減らす前の版と結果を突き合わせられる状態にしておくと安心です。

なお、行と列を入れ替えても答えは同じです。右に何歩、下に何歩の並べ方を数えているだけなので、どちらが縦でも変わりません。ただし表の大きさは変わるので、m と n を取り違えたまま添字を書くと範囲外になります。

やってみよう

  • 3 行 7 列で 28 になることを、表を書いて確かめる
  • 1 行 1 列のとき、答えは 1。出発点と目的地が同じマス
  • 組合せの式でも出る。3 行 4 列なら右に 3 歩と下に 2 歩の並べ方なので、5 個から 2 個を選ぶ組合せで 10

要件

  1. 戻り値は経路の総数 (整数)
  2. 右と下にしか移動できない (上や左には戻れない)
  3. 二次元 DP もしくは 1 次元圧縮 DP で求めること

入出力例

uniquePaths(3, 7) → 28 uniquePaths(3, 2) → 3 uniquePaths(7, 3) → 28 uniquePaths(3, 3) → 6 uniquePaths(1, 1) → 1 uniquePaths(10, 10) → 48620

ヒント

dp[i][j] = (0, 0) から (i, j) への経路数、として dp[i][j] = dp[i-1][j] + dp[i][j-1]

最上行・最左列は全て 1 で初期化する (1 本道なので)

数式的には二項係数 C(m + n - 2, m - 1) でも求まる

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 単語分割可能か (Word Break)

    辞書にある単語の連結で対象文字列を構成できるかを判定する Word Break 問題を、DP で線形時間に近い計算量で解きます。

  • 第6章まとめクイズ — 動的計画法 (上級)

    編集距離、LIS、Kadane、House Robber、グリッド経路数、Word Break の理解度を確認する 4 択クイズです。

  • map と filter を組み合わせる

    配列に対して `map` と `filter` を組み合わせ、偶数だけを 2 倍した結果を返す関数を実装する。関数型プログラミングの基礎を学ぶ。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • 変数データに名前をつけて参照する仕組み
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

グリッド経路数 (Unique Paths)

⌘S で保存