【牛客网 - 华为机试】HJ31 走方格的方案数
HJ31 走方格的方案数
该题与LeetCode 64 最小路径和是一致的
题目描述
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
本题含有多组样例输入。
输入描述:
每组样例输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
每组样例输出一行结果
示例1
输入
2 2
1 2
输出
6
3
代码
package 笔试汇总.华为;/**
* Copyright (C), 2019-2021
* author candy_chen
* date 2021/4/10 19:58
*
* @Classname HJ91
* Description: 走方格的方案数
*/
import java.util.Scanner;
/**
*
*/
public class HJ91 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int num1 = sc.nextInt();
int num2 = sc.nextInt();
System.out.println(methods(num1,num2));
System.out.println(count(num1 + 1,num2 + 1));
}
}
/**
* 递归
* @param num1
* @param num2
* @return
*/
private static int methods(int num1, int num2) {
if (num1 ==0 || num2 == 0){
return 1;
}
return methods(num1 - 1,num2) + methods(num1,num2 - 1);
}
/**
* DP
* @param n
* @param m
* @return
*/
public static int count(int n, int m) {
int[][] dp = new int [n][m];
for (int i = 0; i < n; i++) {
dp[i][0] = 1;
}
for (int j = 0; j < m; j++) {
dp[0][j] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[n-1][m-1];
}
}