用深度優先搜尋解決最長路徑問題

2021-10-08 13:14:53 字數 2009 閱讀 5555

這道題目是困難級別的,原題目位址leetcode,我剛開始沒想出頭緒,看了題解,才想到用深度優先搜尋,僅此而已

給定乙個整數矩陣,找出最長遞增路徑的長度。

對於每個單元格,你可以往上,下,左,右四個方向移動。 你不能在對角線方向上移動或移動到邊界外(即不允許環繞)。

示例 1

:輸入: nums =[[

9,9,

4],[

6,6,

8],[

2,1,

1]] 輸出:

4 解釋: 最長遞增路徑為 [1,

2,6,

9]。示例 2

:輸入: nums =[[

3,4,

5],[

3,2,

6],[

2,2,

1]] 輸出:

4 解釋: 最長遞增路徑是 [3,

4,5,

6]。注意不允許在對角線方向上移動。

如果單純的用深度優先搜尋,會超時。為避免重複計算,記錄已計算過,因為每一格的最長路徑是固定的。以示例1來說明,

[[9

,9,4

],[6

,6,8

],[2

,1,1

]] 用這麼乙個二維陣列來記錄結果。咱們先人腦遍歷。[[

0,0,

0],[

0,0,

0],[

0,0,

0]] 最小的數字是1,那麼這兩個位置,最長路徑就是1,即本身。

[0,0

,0],

[0,0

,0],

[0,0

,1]向外擴散一步

[0,0

,0],

[0,0

,0],

[0,1

,1]

向外擴散一步

[0,0

,0],

[0,2

,0],

[2,1

,1]

兩個2都向外擴散一步

[0,3

,0],

[3,2

,3],

[2,1

,1]

最後得到結果

[4,3

,1],

[3,2

,3],

[2,1

,1]

即,求某乙個單元格的最大路徑,先假設它周圍四格的最大路徑已經算出來了(人腦不擅長遞迴),如果中間這個單元格的數字,大於相鄰的單元格,那最大路徑就是相鄰單元格最大路徑+1,這樣最多可求得四個值,取四個值中最大的那個。

如果文字不太好理解,直接看**。

class solution 

int res =0;

row = matrix.length;

col = matrix[0]

.length;

int[

] mem = new int

[row]

[col]

;for

(int i =

0; i < row; i++)}

return res;

} public int row, col;

public int

x = new int

;// 上下左右四個方向

public int

y = new int

; private int

dfs(

int[

] mem,

int[

] matrix,

int i,

int j)

mem[i]

[j]==1;

// 初始值設定為1

for(

int k =

0; k <

4; k++)}

return mem[i]

[j];

// 返回此單元格的最大路徑

}}

深度優先搜尋解決全排列問題

題目 假如有編號為1 2 3的3張撲克牌和編號為1 2 3的3個盒子。現在需要將這3張撲克牌分別放到3個盒子裡,並且每個盒子有且只能放一張撲克牌。那麼一共有多少種不同的排法?及注釋 include 全域性變數,陣列元素值自動初始化為0 int a 10 充當盒子編號 int book 10 用boo...

深度優先搜尋解決八皇后問題

八皇后問題是什麼 八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌...

深度優先搜尋 廣度優先搜尋(解決小哈)

問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...