最長遞增路徑(多解)

2021-10-08 12:53:56 字數 1657 閱讀 2274

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

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

示例 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]。注意不允許在對角線方向上移動。

解一,記憶化搜尋

class solution 

}return ans;

}public int find(int x,int y,int map)else;

int dy=new int;

int max=0;

for(int i=0;i=0&&xx=0&&yymap[x][y])

}return dis[x][y]=max+1;}}

}

思路簡單直接,dfs+記憶陣列就行了

解二,拓撲排序

class solution , , , };

public int rows, columns;

public int longestincreasingpath(int matrix)

rows = matrix.length;

columns = matrix[0].length;

int outdegrees = new int[rows][columns];

for (int i = 0; i < rows; ++i) }}

}queuequeue = new linkedlist();

for (int i = 0; i < rows; ++i) );}}

}int ans = 0;

while (!queue.isempty()) );}}

}}

}return ans;

}}

借助拓撲排序按層出隊,則遍歷的層數即是遞增序列的最長長度

解三,動態規劃

class solution 

}public int longestincreasingpath(int g)

}nodes.sort((o1, o2) -> o1.val - o2.val);

int f = new int[n][m];

for (int i = 0; i < n; i++) arrays.fill(f[i], 1);

int ans = 0;

int dirs = ;

for (node node : nodes)

}ans = math.max(ans, f[x][y]);

}return ans;

}}

首先對圖中的點集從大到小排序,那麼按照排序進行狀態轉移時,小的數在後面,狀態完全依賴於大的數,即可完成自底向上的動態規劃。

最長遞增路徑

乙個無向圖,可能有自環,有重邊,每條邊有乙個邊權。你可以從任何點出發,任何點結束,可以經過同乙個點任意次。但是不能經過同一條邊2次,並且你走過的路必須滿足所有邊的權值嚴格單調遞增,求最長能經過多少條邊。以此圖為例,最長的路徑是 3 1 2 3 2 或 3 1 2 3 4 長度為4。input 第1行...

最長遞增路徑(YYOJ)

description 給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外。input 測試樣例由多組測試資料組成。每組測試資料第一行輸入兩個正整數n,m代表矩形的行數和列數 1 n,m 500 接下來輸入n m 個數...

矩陣中的最長遞增路徑

矩陣中的最長遞增路徑 給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 題解 首先看到這道題,突然想到島嶼那題,每次向著四個方向不斷遞迴 只是條件是只遞迴比當前數大的數,所以使用深度搜尋,並且返回搜尋中...