题解 | #走方格的方案数#
走方格的方案数
https://www.nowcoder.com/practice/e2a22f0305eb4f2f9846e7d644dba09b
const rl = require("readline").createInterface({ input: process.stdin, output: process.stdout, }); /** * dp 五步: * * 1. dp 数组的含义和下标的定义 * dp[m][n] = ? , m 是横向格子, n是竖向格子 * * 2. 初始状态 m >= 1 n >= 1 * dp[1][1] = 2 * dp[1][2] = 3 * dp[2][1] = 3 * * 3. dp 递推(状态流向) * 只能往右和往下 * 多一个格子,上一个状态要么是在上边,要么是在左边 * * dp[m][n] = dp[m-1][n] + dp[m][n-1] * * 4. dp 遍历顺序 * 状态流向是正向的,从前往后推 * * 5. 打印dp数组 * dp[1][1] = 2 * dp[2][2] = dp[1][2] + dp[2][1] = 3 + 3 = 6 */ rl.on("line", (line) => { const input = line.split(" "); const m = parseInt(input[0]), n = parseInt(input[1]); const res = dpResolve(m, n); console.log(res); }); function recursionResolve(m, n) { if(m <= 0 || n <= 0) { return 1; } return recursionResolve(m-1, n) + recursionResolve(m, n-1); } function dpResolve(m, n) { const dp = new Array(m+1).fill(1).map(() => new Array(n+1).fill(1)); for(let i = 1; i <= m; i++) { for(let j = 1; j <= n; j++) { dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } return dp[m][n]; }
唯一要注意的是生成的数组和题目给的m、n之间的差别,数组下标是从0开始的,这里为了简便和题意保持一致,生成了(m+1,n+1)的二维数组。