牛客(美團) 拜訪(動態規劃)

2021-10-24 12:02:12 字數 1710 閱讀 1604

現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。

給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,-1代表不能經過的地區,0代表可以經過的地區,請返回方案數,保證一定存在合法路徑。保證矩陣的長寬都小於等於10。

測試樣例:

[[0,1,0],[2,0,0]],2,3

返回:2

注:題目的意思不夠清晰,所謂的上中下選一種實際是在上下走向上要求往上走了就只能一路向上了,不可再向下了,但左右不管。但對於左中右選一種則就是管水平走向,走了右便不再有任何往左走的機會了,同理上下它不管。

再直白一點就是只有四種走向,右上走(包括只往右走或只往上走,之後同理)、右下走、坐上走、左下走。

1、先確定起點和終點的位置,儲存到變數中。

2、處理特殊情況,起點與終點同位置(之後想想感覺不存在,因為乙個元素不可能既賦予1值又賦予2值,它只可能是乙個值)

3、給邊緣路徑賦值(動態規劃需要用到之前的值來推出後面的值)

4、邊緣完成後便是內部賦值。

5、賦值完後,最終終點的賦值就是答案了。

public

static

intcountpath

(int

map,

int n,

int m)

else

if(map[i]

[j]==2)

}}// 兩點重合,那麼只有原地不動一種路徑走法

if(startx == endx && starty == endy)

return1;

// 用於記錄可以經過此點的路徑個數

int dp[

]=newint

[n][m]

;// 列數對應左右走向,行數對應上下走向

// 根據起點與終點座標的差值,來判斷往哪個方向走

int leftorright = endy - starty >0?

1:-1

;// >0往右走(i+),<0往左走(i-)

int upordown = endx - startx >0?

1:-1

;// >0往下走(y+),<0往上走(y-)

dp[startx]

[starty]=1

;// 起點的路徑數設定為1

// 行數從起點往終點的方向請進一步(水平方向前進一步)的位置開始迴圈

int row = startx + upordown;

while

((row - endx)

* upordown <=0)

// 列數為從起點到終點的方向前進一步(垂直方向)的位置開始迴圈

int column = starty + leftorright;

while

((column - endy)

* leftorright <=0)

// 重置迴圈的起點橫行數

row = startx + upordown;

while

((row - endx)

* upordown <=0)

row += upordown;

}return dp[endx]

[endy]

;}

注:參考牛客上大佬的思路,其個人主頁

牛客 拜訪 動態規劃

左右中只能選乙個方向,若選擇左只能一直向左走。上下中只能選擇乙個方向,若選擇下只能一直向下。所以有2種情況 1 二者位置在對角線上 2 兩者位置重合或處於同一行或同一列 class visit if map i j 2 同行或同列 這裡應該還能優化到下面的對角線那種情況 懶 if si ei if ...

動態規劃 美團筆試題 拜訪

題目 現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區,0...

拜訪 動態規劃

現在有乙個城市銷售經理,需要從公司出發,去拜訪市內的商家,已知他的位置以及商家的位置,但是由於城市道路交通的原因,他只能在左右中選擇乙個方向,在上下中選擇乙個方向,現在問他有多少種方案到達商家位址。給定乙個地圖map及它的長寬n和m,其中1代表經理位置,2代表商家位置,1代表不能經過的地區,0代表可...