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

走方格的方案数

https://www.nowcoder.com/practice/e2a22f0305eb4f2f9846e7d644dba09b

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            // 递归
            System.out.println(rec(n, m));
            // 动态规划
            // System.out.println(dp(n, m));
            // 组合
            // System.out.println(combine(n, m));
        }
    }

    public static int rec(int n, int m) {
        if (m == 0 || n == 0) {
            return 1;
        }
        return rec(m - 1, n) + rec(m, n - 1);
    }

    public static int dp(int n, int m) {
        // n个格子就有n+1条线
        n++;
        m++;
        // 避免处理边界问题(实际上空间消耗增加了)
        int[][] d = new int[n + 1][m + 1];
        // 初始子问题:只有一个点时有一条路,其他时候都为它上面的路和加左边的路和
        d[1][1] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                d[i][j] += d[i - 1][j] + d[i][j - 1];
            }
        }
        return  d[n][m];
    }
    /**
     * 排列组合
     * 一共要走 m+n步 在其中挑选n步向下的 C(n, n+m) = (m+n)! / (n!*m!)
     */
    public static int combine(int n, int m) {
        return factorial(m + n) / (factorial(m) * factorial(n));
    }
    public static int factorial(int n) {
        int sum = 1;
        for (int i = 1; i <= n; i++) {
            sum *= i;
        }
        return sum;
    }
}

全部评论

相关推荐

10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务