编辑代码

function collectCoins(coins) {
  const m = coins.length;
  const n = coins[0].length;

  // 定义状态数组dp,初始化dp[0][0]为起点的硬币数量
  const dp = Array.from({ length: m }, () => Array(n).fill(0));
  dp[0][0] = coins[0][0];

  // 计算第一行和第一列的最大硬币数量
  for (let i = 1; i < m; i++) {
    dp[i][0] = dp[i-1][0] + coins[i][0];
  }
  for (let j = 1; j < n; j++) {
    dp[0][j] = dp[0][j-1] + coins[0][j];
  }

  // 填表计算dp数组
  for (let i = 1; i < m; i++) {
    for (let j = 1; j < n; j++) {
      dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + coins[i][j];
    }
  }

  // 返回右下角位置的最大硬币数量
  return dp[m-1][n-1];
}