문제

const fs = require("fs");
const INPUT_FILE = process.platform === "linux" ? "/dev/stdin" : "./inputs.txt";
const inputs = fs.readFileSync(INPUT_FILE).toString().trim().split("\n");
 
const [m, n] = inputs[0].split(" ").map(Number);
const arr = [
  new Array(n + 1).fill(0),
  ...inputs.slice(1).map((e) => [0, ...e.split("").map(Number)]),
];
const resultArr = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
 
const dLoc = [
  [0, -1],
  [-1, 0],
  [1, 0],
];
 
let max = -Infinity;
// 열
for (let i = 1; i <= n; i++) {
  // 행
  for (let j = 1; j <= m; j++) {
    // 첫 줄은 출력값이 자기 가중치 그대로 감
    if (i === 1) {
      resultArr[j][i] = arr[j][i];
    } else {
      const queue = [[j, i]];
      const visited = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
      while (queue.length) {
        const [row, col] = queue.shift();
        for (const [dr, dc] of dLoc) {
          const nr = row + dr;
          const nc = col + dc;
          if (nr < 1 || nr > m || nc < 1 || nc > n || visited[nr][nc]) continue;
          if (Math.abs(j - nr) <= i - nc && nc < i) {
            // 가중치에 출력값을 더한거랑 비교해봄
            resultArr[j][i] = Math.max(
              resultArr[j][i],
              resultArr[nr][nc] + arr[j][i]
            );
            visited[nr][nc] = 1;
            max = Math.max(max, resultArr[nr][nc]);
            queue.push([nr, nc]);
          }
        }
      }
    }
  }
}
 
console.log(max);
 

 
const fs = require("fs");
const INPUT_FILE = process.platform === "linux" ? "/dev/stdin" : "./inputs.txt";
const inputs = fs.readFileSync(INPUT_FILE).toString().trim().split("\n");
 
const [m, n] = inputs[0].split(" ").map(Number);
const arr = [
  new Array(n + 1).fill(0),
  ...inputs.slice(1).map((e) => [0, ...e.split("").map(Number)]),
];
const dp = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
const acc = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));
 
let maxVal = -Infinity;
 
for (let i = 1; i <= n; i++) {
  for (let j = 1; j <= m; j++) {
    if (i === 1) {
      // 첫 번째 열은 그대로 설정
      dp[j][i] = arr[j][i];
      acc[j][i] = dp[j][i];
      continue;
    }
    for (let k = -1; k <= 1; k++) {
      const prevRow = j + k;
      if (prevRow < 1 || prevRow > m) continue;
      dp[j][i] = Math.max(dp[j][i], acc[prevRow][i - 1]);
      acc[j][i] = dp[j][i] + arr[j][i];
      maxVal = Math.max(maxVal, dp[j][i]);
    }
  }
}
 
console.log(maxVal);
 
const fs = require("fs");
const INPUT_FILE = process.platform === "linux" ? "/dev/stdin" : "./inputs.txt";
const inputs = fs.readFileSync(INPUT_FILE).toString().trim().split("\n");
 
const [M, N] = inputs[0].split(" ").map(Number);
const inp = Array.from({ length: M + 1 }, () => Array(N + 1).fill(0));
const store = Array.from({ length: M + 1 }, () => Array(N + 1).fill(0));
const print = Array.from({ length: M + 1 }, () => Array(N + 1).fill(0));
 
let ret = 0;
 
for (let i = 1; i <= M; i++) {
  const row = inputs[i].split("").map(Number);
  for (let j = 1; j <= N; j++) {
    inp[i][j] = row[j - 1];
  }
}
 
for (let j = 1; j <= N; j++) {
  for (let i = 1; i <= M; i++) {
    for (let k = -1; k <= 
1; k++) {
      const prevRow = i + k;
      if (prevRow >= 1 && prevRow <= M) {
        store[i][j] = Math.max(store[i][j], print[prevRow][j - 1]);
      }
    }
    print[i][j] = store[i][j] + inp[i][j];
    ret = Math.max(ret, store[i][j]);
  }
}
 
// 결과 출력
console.log(ret);