一、問題描述
給定 一個 m x n 的棋盤,只能向右或者向下走,,求棋子從左上角走到右下角的情況一共有多少種?
二、解題思路
這是一個動態規劃求解的問題,原問題的解可以由子問題求解。
狀態轉移方程:f[m][n] = f[m-1][n]+f[m][n-1]
動態規劃不一定會用帶遞歸,而且遞歸容易棧溢出,雙重for循環直接從底層向上求解即可。
注意第一行和第一列的值都爲1,因爲一直往右走或者往下走只有一種情況。
三、代碼實現
public class Maze {
public static void main(String[] args) {
int result = new Maze().f(8, 8);
System.out.println(result);
}
public int f(int m,int n) {
int [][]f = new int[m][n];
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
if(i==0 || j==0) {
f[i][j] = 1;
}else {
f[i][j] = f[i-1][j] + f[i][j-1];
}
}
}
for (int[] js : f) {
for (int s : js) {
System.out.print(s+"\t");
}System.out.println();
}
return f[m-1][n-1];
}
}
四、運行結果
1 1 1 1 1 1 1 1
1 2 3 4 5 6 7 8
1 3 6 10 15 21 28 36
1 4 10 20 35 56 84 120
1 5 15 35 70 126 210 330
1 6 21 56 126 252 462 792
1 7 28 84 210 462 924 1716
1 8 36 120 330 792 1716 3432
3432