Cho ma trận nhị phân và giá trị k. Từ ô (0,0) đi đến (m-1,n-1) chỉ được đi xuống hoặc phải. Điểm của đường đi = tổng giá trị các ô trên đường. Đếm số đường đi có điểm = k. Kết quả modulo 10^9+7.
Ví dụ ma trận 3x3, k=2 → kết quả 4 (4 đường đi: RRDD, DRRD, DDRR, DRDR).
Giải thuật (DFS đệ quy)
- Hàm
dfs(i, j, pts)trả về số đường từ(i,j)với điểm tích lũypts. - Nếu vượt biên → 0.
- Cộng
matrix[i][j]vàopts. - Nếu đến đích → trả về 1 nếu
pts == kelse 0. - Đệ quy:
dfs(i+1, j, pts) + dfs(i, j+1, pts).
Lưu ý: Giải pháp này chưa dùng memoization, có thể tối ưu bằng DP 3 chiều.
Ví dụ minh họa
class Solution:
def solve(self, matrix, k):
m, n = len(matrix), len(matrix[0])
MOD = 10**9 + 7
def dfs(i=0, j=0, pts=0):
if i >= m or j >= n:
return 0
pts += matrix[i][j]
if i == m - 1 and j == n - 1:
return int(pts == k)
return (dfs(i + 1, j, pts) + dfs(i, j + 1, pts)) % MOD
return dfs()
ob = Solution()
matrix = [[0,0,1],[1,0,1],[0,1,0]]
k = 2
print(ob.solve(matrix, k)) # Output: 4
Đầu vào / Đầu ra
Input: [[0,0,1],[1,0,1],[0,1,0]], 2
Output: 4