สมมติว่าเรามีเมทริกซ์ 2 มิติ เราต้องการหาความยาวของเส้นทางที่เพิ่มขึ้นอย่างเคร่งครัด (strictly increasing path) สามารถเคลื่อนที่ได้ 4 ทิศทาง: บน, ล่าง, ซ้าย, ขวา (ไม่ได้ทแยง)
เช่น ถ้าข้อมูลนำเข้าคือ:
2 4 6 1 5 7 3 3 9ผลลัพธ์จะเป็น 6 เนื่องจากเส้นทางที่ยาวที่สุดคือ
[1, 2, 4, 6, 7, 9]
ขั้นตอนการแก้ปัญหา (DFS + Memoization)
n := จำนวนแถว, m := จำนวนคอลัมน์moves := [[1,0], [-1,0], [0,1], [0,-1]]- ฟังก์ชัน
dp(y, x):- ถ้านอกขอบเขต คืน 0
currVal := matrix[y][x],res := 0- วนทุกทิศทาง
dในmoves:- คำนวณ
newY, newX - ถ้าอยู่ในขอบเขตและ
matrix[newY][newX] > currVal:res := max(res, dp(newY, newX))
- คำนวณ
- คืน
res + 1
- จากเมธอดหลัก วนทุกเซลล์ หา
max(dp(i, j))
ตัวอย่างโค้ด
class Solution:
def solve(self, matrix):
n, m = len(matrix), len(matrix[0])
moves = [[1, 0], [-1, 0], [0, 1], [0, -1]]
def dp(y, x):
if y < 0 or y >= n or x < 0 or x >= m:
return 0
currVal = matrix[y][x]
res = 0
for d in moves:
dy, dx = d
newY, newX = y + dy, x + dx
if (0 <= newY < n and 0 <= newX < m and matrix[newY][newX] > currVal):
res = max(res, dp(newY, newX))
return res + 1
result = 0
for i in range(n):
for j in range(m):
result = max(result, dp(i, j))
return result
ob = Solution()
matrix = [
[2, 4, 6],
[1, 5, 7],
[3, 3, 9]
]
print(ob.solve(matrix))
ข้อมูลนำเข้า
[ [2, 4, 6], [1, 5, 7], [3, 3, 9] ]
ผลลัพธ์
6