ABC128 D Lamp

問題の解き方よりも実装のほうが大変だった問題。他の人の解き方を見て、条件分岐の少ない再実装をしました。配列の実装を1から始めるのがポイントのようです。

 

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

signed main() {
int h, w;
cin >> h >> w;
vector<string> s(h);
for (auto&& u : s) cin >> u;

vector<vector<int>> l(h + 2, vector<int>(w + 2, 0));
vector<vector<int>> r(h + 2, vector<int>(w + 2, 0));
vector<vector<int>> u(h + 2, vector<int>(w + 2, 0));
vector<vector<int>> d(h + 2, vector<int>(w + 2, 0));

for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++) {
if (s[i - 1][j - 1] == '.') {
l[i][j] = l[i][j - 1] + 1;
u[i][j] = u[i - 1][j] + 1;
}
}

for (int i = h; i >= 1; i--)
for (int j = w; j >= 1; j--) {
if (s[i - 1][j - 1] == '.') {
r[i][j] = r[i][j + 1] + 1;
d[i][j] = d[i + 1][j] + 1;
}
}

int ret = 0;
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++) {
if (s[i - 1][j - 1] == '.')
ret = max(ret, l[i][j] + u[i][j] + r[i][j] + d[i][j] - 3);
}
cout << ret << endl;
}