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: