牛客網鏈接:機器人走方格I
題目描述
有一個XxY的網格,一個機器人只能走格點且只能向右或向下走,要從左上角走到右下角。請設計一個算法,計算機器人有多少種走法。
給定兩個正整數int x,int y,請返回機器人的走法數目。保證x+y小於等於12。
測試樣例:
x、y:2 2
return:2
解題思路
我們解題之前必須弄懂題目想要讓我們求什麼?需要注意什麼?在這道提上,我認爲最需要注意的話是只能走格點,這個代表的意思是,我們將x、y想象成爲一個一個的點,而不是一個小正方形。
當我們從左上角(x,y)要給右下角(1,1)走的時候,會有兩種情況:
- 向右走,即座標變爲(x,y-1)
- 向下走,即座標變爲(x-1,y)
在(x,y-1)時,也會有兩種情況:
- 向右走,即座標變爲(x, y-2)
- 向下走,即座標變爲(x-1,y-1)
以此類推:當我們走到(x, 1)時,就不能向右走了,即只有一種情況;同理,當我們走到(1,y)時,就不能向下走了,即只有一種情況。
因此由動態規劃的思想:
- 狀態: 從(x,y)走到(1,1)的走法。
- 狀態轉移: f(x, y) = f(x-1, y) + f(x, y-1)
- 初始化: f(x, 1) = 1, f(1, y) = 1
- 返回結果: f(x, y)
在這裏爲了方便理解,我們舉兩個例子(2,2)(3,3)來推導一個這個過程:
import java.util.*;
public class Robot {
public int countWays(int x, int y) {
if(x == 1 || y == 1)
return 1;
return countWays(x-1, y) + countWays(x, y-1);
}
}
由上面的圖解我們會發現遞歸的過程是無比的複雜,所以我們在思考,從(0,0)走到(x-1,y-1)在記錄每一次的數量到數組,使用時查表不就很簡單了。
import java.util.*;
public class Robot {
public int countWays(int x, int y) {
int[][] dp = new int[x][y];
dp[0][0] = 0;
// 處理以y=0的一列
for(int i = 1; i < dp.length; i++){
dp[i][0] = 1;
}
// 處理以x=0的一行
for(int i = 1; i < dp[0].length; i++){
dp[0][i] = 1;
}
// 處理中間模塊
for(int i = 1; i < dp.length; i++){
for(int j = 1; j < dp[i].length; j++){
dp[i][j] = dp[i][j-1] + dp[i-1][j];
}
}
return dp[x-1][y-1];
}
}
同類題:
unique-paths