機器人走方格I

牛客網鏈接:機器人走方格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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章