/* -*- coding: utf-8 -*- * * 2328.cc: No.2328 Build Walls - yukicoder */ #include #include using namespace std; /* constant */ const int MAX_H = 800; const int MAX_W = 800; const int INF = 1 << 30; /* typedef */ /* global variables */ int as[MAX_H][MAX_W], dp[MAX_H][MAX_W]; /* subroutines */ /* main */ int main() { int h, w; scanf("%d%d", &h, &w); h -= 2; for (int i = 0; i < h; i++) for (int j = 0; j < w; j++) scanf("%d", as[i] + j); for (int i = 0; i < h; i++) dp[i][0] = (as[i][0] >= 0) ? as[i][0] : INF; for (int j = 1; j < w; j++) for (int i = 0; i < h; i++) { if (as[i][j] >= 0) { int d0 = (i > 0) ? dp[i - 1][j - 1] : INF; int d1 = dp[i][j - 1]; int d2 = (i + 1 < h) ? dp[i + 1][j - 1] : INF; int d = min(min(d0, d1), d2); dp[i][j] = (d < INF) ? d + as[i][j] : INF; } else dp[i][j] = INF; } int mind = INF; for (int i = 0; i < h; i++) mind = min(mind, dp[i][w - 1]); printf("%d\n", (mind < INF) ? mind : -1); return 0; }