cover

1219. 最大の金を持つパス

https://leetcode.com/problems/path-with-maximum-gold/

すでに似たような別の問題を解いたことがあります。再帰関数は美しく見えますが、スタックオーバーフローが発生する可能性があります。

let around = (i, j) => [
  [i - 1, j],
  [i + 1, j],
  [i, j - 1],
  [i, j + 1],
];

let step = (grid, i, j, footnotes = []) => {
  let m = grid.length;
  let n = grid[0].length;
  if (i < 0 || i >= m || j < 0 || j >= n) {
    return 0;
  }
  if (grid[i][j] === 0) {
    return 0;
  }
  if (footnotes.find(([fi, fj]) => fi === i && fj === j)) {
    return 0;
  }
  footnotes.push([i, j]);
  return (
    grid[i][j] +
    Math.max(
      ...around(i, j).map(([ni, nj]) => step(grid, ni, nj, [...footnotes])),
    )
  );
};

var getMaximumGold = function (grid) {
  let combs = grid.map((v, i) => v.map((c, j) => [i, j])).flat();
  return Math.max(...combs.map(([i, j]) => step(grid, i, j)));
};