Cho một ma trận 2D, tìm độ dài đường đi tăng dần nghiêm ngặt (strictly increasing) dài nhất. Chỉ được di chuyển lên, xuống, trái, phải (không chéo).
Ví dụ ma trận:
2 4 6 1 5 7 3 3 9Đường đi dài nhất: [1, 2, 4, 6, 7, 9] → độ dài 6.
Giải thuật (DFS + Memoization / DP trên lưới)
- Khởi tạo mảng
dp(hoặc dùng cache) để lưu độ dài đường đi dài nhất bắt đầu từ mỗi ô. - Hàm
dfs(y, x):- Nếu ngoài phạm vi, trả về 0.
- Nếu đã tính, trả về giá trị cache.
- Với 4 hướng di chuyển, nếu ô mới có giá trị > ô hiện tại:
res = max(res, dfs(newY, newX)). - Lưu và trả về
res + 1.
- Duyệt mọi ô, lấy max của
dfs(i, j).
Mã nguồn Python
class Solution:
def solve(self, matrix):
n, m = len(matrix), len(matrix[0])
moves = [[1, 0], [-1, 0], [0, 1], [0, -1]]
from functools import lru_cache
@lru_cache(None)
def dp(y, x):
currVal = matrix[y][x]
res = 0
for dy, dx in moves:
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)) # Output: 6
Đầu vào
[[2, 4, 6], [1, 5, 7], [3, 3, 9]]
Đầu ra
6