Cho danh sách vị trí đá stones (đã sắp xếp). Bắt đầu tại đá đầu, muốn đến đá cuối. Mỗi bước nhảy k-1, k, hoặc k+1 bước (k là độ dài nhảy trước). Kiểm tra có thể đến cuối không.
Ví dụ: stones = [0,1,3,4,5,6,8,9,13] → True (0→1→3→5→8→13).
Giải thuật (DFS + Memoization)
- Chuyển
stonesthành tập hợpstone_setđể tra O(1). - Hàm
check(pos, prev_jump):- Nếu
pos == end: True. - Thử nhảy
prev-1, prev, prev+1(nếu ≥1). Nếu vị trí mới có đá vàcheck(next, jump)True → True.
- Nếu
- Gọi
check(start, 0).
Mã nguồn Python
class Solution:
def solve(self, A):
start, end = A[0], A[-1]
A = set(A)
from functools import lru_cache
@lru_cache(None)
def check(pos=start, prev=0):
if pos == end:
return True
for jump in (prev - 1, prev, prev + 1):
if jump >= 1:
next_pos = pos + jump
if next_pos in A and check(next_pos, jump):
return True
return False
return check()
ob = Solution()
stones = [0, 1, 3, 4, 5, 6, 8, 9, 13]
print(ob.solve(stones)) # Output: True
Đầu vào
[0, 1, 3, 4, 5, 6, 8, 9, 13]
Đầu ra
True