สมมติว่าเรามีเมทริกซ์ไบนารีขนาด N x M โดย 0 = ช่องว่าง, 1 = ช่องบล็อก เริ่มจากมุมซ้ายบน (0,0) ต้องการหาจำนวนวิธีเดินไปมุมขวาล่าง (N-1, M-1) เดินได้เฉพาะขวาและล่าง ถ้าคำตอบมากเกินไป ให้ modulo 10^9+7
เช่น เมทริกซ์:
0 0 1 0 0 0 1 1 0ผลลัพธ์ = 2 วิธี: [Right, Down, Right, Down] และ [Down, Right, Right, Down]
ขั้นตอนการแก้ปัญหา (Dynamic Programming)
dp := matrix ขนาดเดียวกัน เติม 0,dp[0][0] = 1- เติมคอลัมน์แรก: ถ้า
matrix[i][0] == 1หยุด, มิฉะนั้นdp[i][0] = 1 - เติมแถวแรก: ถ้า
matrix[0][j] == 1หยุด, มิฉะนั้นdp[0][j] = 1 - วน
i=1..n-1, j=1..m-1:- ถ้า
matrix[i][j] == 1:dp[i][j] = 0 - มิฉะนั้น:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
- ถ้า
- คืน
dp[-1][-1]
ตัวอย่างโค้ด
class Solution:
def solve(self, matrix):
dp = [[0] * len(matrix[0]) for _ in range(len(matrix))]
dp[0][0] = 1
for i in range(1, len(matrix)):
if matrix[i][0] == 1:
break
else:
dp[i][0] = 1
for j in range(1, len(matrix[0])):
if matrix[0][j] == 1:
break
else:
dp[0][j] = 1
for i in range(1, len(matrix)):
for j in range(1, len(matrix[0])):
if matrix[i][j] == 1:
dp[i][j] = 0
else:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
return dp[-1][-1]
ob = Solution()
matrix = [
[0, 0, 1],
[0, 0, 0],
[1, 1, 0]
]
print(ob.solve(matrix))
ข้อมูลนำเข้า
matrix = [ [0, 0, 1], [0, 0, 0], [1, 1, 0] ]
ผลลัพธ์
2