Official

D - Weak Takahashi Editorial by KoD


マス \((i, j)\) から歩き初めたとき、立ち止まるまでに通ることのできるマスの個数の最大値を \(f(i, j)\) とおきます。

便宜上、\((i, j)\) が壁であるか、グリッドの外を表す場合は \(f(i, j) = 0\) とします。すると、空きマス \((i, j)\) に対し、以下の関係が成り立ちます。

  • \(f(i, j) = \max (f(i + 1, j), f(i, j + 1)) + 1\)

よって、\(i, j\) の大きい順に \(f(i, j)\) を確定させていくことができます。\(f(1, 1)\) が答えとなります。

問題文や解説では 1-indexed で考えていましたが、以下の実装例では 0-indexed になっていることに注意してください。
実装例 (C++) :

#include <bits/stdc++.h>
using namespace std;

int main() {
  int n, m;
  cin >> n >> m;
  vector c(n, vector<char>(m));
  for (auto& v : c) {
    for (char& x : v) {
      cin >> x;
    }
  }
  vector f(n + 1, vector<int>(m + 1));
  for (int i = n - 1; i >= 0; --i) {
    for (int j = m - 1; j >= 0; --j) {
      if (c[i][j] == '#') continue;
      f[i][j] = max(f[i + 1][j], f[i][j + 1]) + 1;
    }
  }
  cout << f[0][0] << '\n';
}

posted:
last update: