题解 | #走方格的方案数#

走方格的方案数

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)的二维数组。

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
joe2333:怀念以前大家拿华为当保底的日子
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务