931. 下降路径最小和
给你一个 n x n 的 方形 整数数组  matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。
下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。
链接
解析
这题很容易找出转换方程和 base case
可以直接用 matrix 来做初始化 dp 数组,因为 dp 的初始值为第一行,根据转换方程,第一行的值为它本身
1 2 3 4 5 6 7 8 9 10
   | 0 <= i < dp.length;
  0 <= j < dp[i].length;
  preCol = j - 1 >= 0;
  aftCol = j + 1 < dp[i].length;
  dp[i][j] =   Math.min(dp[i - 1][preCol], dp[i - 1][j], dp[i - 1][aftCol]) + dp[i][j];
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | function minFallingPathSum(matrix: number[][]): number {   const dp = matrix.splice(0);   const rowLen = dp.length;   for (let row = 1; row < rowLen; row++) {     const cols = dp[row];     const colLen = cols.length;     const preRow = row - 1;     for (let col = 0; col < colLen; col++) {       const pres: number[] = [];       pres.push(dp[preRow][col]);       const preCol = col - 1;       const aftCol = col + 1;       if (preCol >= 0) {         pres.push(dp[preRow][preCol]);       }       if (aftCol < colLen) {         pres.push(dp[preRow][aftCol]);       }       dp[row][col] = Math.min(...pres) + dp[row][col];     }   }   const lastDp = dp[rowLen - 1];   let min = lastDp[0];   lastDp.forEach((num) => {     min = Math.min(min, num);   });   return min; }
  |