Giải quyết một mê cung số phễu


18

8 tuổi của tôi đã chán việc tạo ra các mê cung thông thường và đã tạo ra các biến thể trông như thế này:

Mẫu phễu số

Ý tưởng là bắt đầu từ x và đạt o thông qua các quy tắc thông thường. Ngoài ra, bạn có thể "nhảy" từ bất kỳ số nguyên nào sang bất kỳ số nguyên nào khác , nhưng bạn phải trả tiềnđô la cho các đặc quyền. Mục tiêu là để giải quyết mê cung với chi phí thấp nhất. Trong ví dụ trên, chúng ta có thể đi từ x đến o qua x-14-18-27-28-o với chi phí 5, nhưng chỉ rẻ hơn khi đi x-13-11-9-8-29-28-o 4.b | a - b |ab|ab|

Vì vậy, đây là câu hỏi của tôi: giải pháp tốt nhất (về thời gian chạy tiệm cận) bạn có thể nghĩ gì để giải quyết vấn đề này? Bạn có thể đưa ra bất kỳ giả định hợp lý nào về định dạng đầu vào.

Lưu ý: Tôi đang sử dụng thẻ "câu đố" ở đây vì tôi có câu trả lời , nhưng tôi không chắc nó tối ưu và muốn xem liệu có ai khác có thể cải thiện giải pháp của tôi không. (Ở đây là số nguyên trong mê cung.)nO(n2)n


7
Đạo cụ cho con bạn để tạo ra các câu đố sáng tạo và toán học như vậy!
bbejot

2
@bbejot Bạn sẽ thấy một số thứ anh ấy hỏi tôi ... đôi khi tôi không thể trả lời câu hỏi của anh ấy. Ví dụ: math.stackexchange.com/questions/33094/NH
Fixee

1
Tôi không chắc chắn rằng tính toán chi phí của bạn là chính xác. x-14-18-27-28-o nên có giá và x-13-11-9-8-29-28-o nên có giá . 2 + 2 + 1 + 21 + 1 = 274+9+1=142+2+1+21+1=27
Dave Clarke

1
@Dave không phải tất cả các chuyển đổi là nhảy. Chúng ta có thể viết 'ab' cho các bước nhảy (có chi phí là ) và 'a-> b' để đi bộ trong biểu đồ từ a đến b (có chi phí bằng ), chỉ được phép nếu chúng có thể truy cập mà không phá vỡ một bức tường trong mê cung. Trong ký hiệu này, chúng ta có x-> 14-18-> 27-28-> o và chi phí là 5 và x-> 13-11-> 9-8-> 29-28-> o. Fixee mỏng của tôi đã không giới thiệu ký hiệu này vì nó là dư thừa: không có lý do gì để nhảy hai lần và do đó bước nhảy và bước đi trong mê cung sẽ thay thế. 0|ab|0
Artem Kaznatcheev

2
Đây là một vấn đề bài tập về nhà tuyệt vời!
Jeffε

Câu trả lời:


15

Bạn có thể giải quyết vấn đề này trong thời gian bằng cách sử dụng một biến thể của thuật toán Dijkstra. Chúng ta có thể thoát khỏi việc không thực hiện tất cả các cập nhật khoảng cách khi chúng ta truy cập một nút mới. Nếu chúng tôi ghé thăm một nút , chúng ta chỉ cần cập nhật các khoảng cách của tất cả mọi thứ có thể đi bộ từ đến 0, và để cập nhật các khoảng cách để hai nút và với các giá trị gần nhất với ít hơn và lớn hơn mà có không đã được chọn chưa.y y y - y + y yO(nlogn)yyyy+yy

Các cập nhật này là đủ để giữ cho heap trả về phần tử tối thiểu bởi vì bất kỳ nút gần nhất nào bạn nhảy tới phải có số lượng ngay phía trên hoặc ngay dưới một nút đã được truy cập.

y + O ( n log n )yy+O(nlogn)O(n)O(nlogn)O(nlogn)


x1,,xnxo2xi2xi+1xixixi

O(nlgn)y+yO(nlgn)

O(nloglogn)O(n)

4

O(n2)

Có vẻ tự nhiên để chuyển đổi vấn đề này thành vấn đề đường dẫn ngắn nhất với nút bắt đầu đặc biệt (x) và nút kết thúc (0). Cũng có một nút khác cho mỗi số. Cả x và 0 đều có các cạnh có trọng số 0 cho tất cả các nút số có thể tiếp cận được trong mê cung. Tất cả các nút số được kết nối với trọng số 0 (nếu các số có thể tiếp cận được mê cung) hoặc với sự khác biệt giữa các số (nếu không thể tiếp cận được mê cung).

O(n2)n2O(n2)


O(n2)O(n2lgn)

1
rO(r2)

O(nlogn)O(r2+nlogn)Ω(nlogn)

Ω(n2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.