thuật toán cho bài toán euler dự án số 18


8

Vấn đề số 18 từ trang web của Project Euler như sau:

By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23.

3
7 4
2 4 6
8 5 9 3

That is, 3 + 7 + 4 + 9 = 23.

Find the maximum total from top to bottom of the triangle below:

75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o)

Việc xây dựng các vấn đề này không làm rõ nếu

  • "Kẻ phản bội" là người tham lam, nghĩa là anh ta luôn chọn đứa trẻ có giá trị cao hơn
  • tối đa của mỗi lần đi bộ được yêu cầu

Các NOTEnói rằng, rằng it is possible to solve this problem by trying every route. Điều này có nghĩa với tôi, điều đó cũng có thể mà không cần !

Điều này dẫn đến câu hỏi thực tế của tôi: Giả sử rằng không phải người tham lam là tối đa, có thuật toán nào tìm thấy giá trị bước đi tối đa mà không thử mọi tuyến đường và điều đó không hoạt động như thuật toán tham lam không?

Tôi đã triển khai một thuật toán trong Java, đặt các giá trị lên hàng đầu trong cấu trúc nút, sau đó áp dụng thuật toán tham lam. Tuy nhiên, kết quả được dự đoán là sai bởi Project Euler.

sum = 0;

void findWay(Node node){
    sum += node.value;
    if(node.nodeLeft != null && node.nodeRight != null){
            if(node.nodeLeft.value > node.nodeRight.value){
                findWay(node.nodeLeft);
            }else{
                findWay(node.nodeRight);
            }
        }
}

1
Đôi khi, chọn số thấp hơn sẽ dẫn đến việc chọn số cao hơn cho lựa chọn tiếp theo, một mức đủ cao để bù cho differencec trong lựa chọn trước, đây là lý do tại sao thuật toán của bạn sai.
Jimmy Hoffa

Tất nhiên là có, nhưng điều này được hỏi trong vấn đề?
Valentino Ru

"Tổng số tối đa" với tôi có nghĩa là chính xác đó. Tối đa là một từ tuyệt đối, vì vậy hãy đọc nó là "tổng số tối đa tuyệt đối có thể".
Jimmy Hoffa

2
Tôi nghĩ rằng tôi sẽ giải quyết nó bằng thuật toán Dijkstra đã sửa đổi. Tôi sẽ thử nó vào ngày mai. Nó sẽ cho phép bạn tìm ra một cách nhanh chóng khi kết thúc sớm một tuyến đường. Có lẽ có một cách tốt hơn ... đó là giấc ngủ ngon của tôi.
James

Đây thường là một ví dụ về một vấn đề lập trình động, thường có thể giải quyết được bằng một phương pháp tham lam. Lập trình động đòi hỏi giải pháp của các bài toán con để giải quyết vấn đề chính.
Peter Smith

Câu trả lời:


9

Spoiler alert : Câu trả lời này dẫn bạn đến một giải pháp, nhưng không thực hiện nó


Sử dụng ví dụ của WuHoUnited, được sửa đổi cho tính duy nhất:

   9
  7 0
 2 4 6
8 5 1 3

Hãy tự hỏi mình điều này: Nếu bạn thấy mình ở mức 2, bạn có bao giờ lấy 8 thay vì 5, biết chúng là các nút lá của cây không? Tương tự, nếu bạn thấy mình ở tuổi 6, bạn có bao giờ lấy 3 thay vì 1, biết đó là các nút lá của cây không?

Chắc chắn là không rồi. Bây giờ chúng ta có thể giảm cây, biết chúng ta sẽ đưa ra quyết định gì ở nhánh áp chót (bất kể chúng ta đến đó bằng cách nào):

   9
  7 0
10 9 9

Tôi nghĩ rằng bạn thấy nơi này sẽ đi.


1

Là một người đã giải quyết vấn đề, tôi có thể nói với bạn rằng thuật toán tham lam KHÔNG phải là thứ họ đang tìm kiếm.

Nó đang tìm kiếm giá trị tối đa của tất cả các tuyến đường có thể.

thí dụ

   3
  7 4
 2 4 6
8 5 1 3

3 + 7 + 4 + 5 = 19 <- tham lam
3 + 7 + 2 + 8 = 20 <- không tham lam

Vì vậy, câu trả lời nên là 20


ok nhưng điều này có nghĩa là không có cách nào khác ngoài đi bộ trên mọi tuyến đường, phải không?
Valentino Ru

1
@ValentinoRu rõ ràng là không, vấn đề euler đã nói như vậy. Đây là một vấn đề về biểu đồ, vì vậy hãy thử vẽ biểu đồ với các bộ số nhỏ theo nhiều cách khác nhau và xem liệu bạn có thể xác định bất kỳ biểu diễn nào của chúng để đưa thông tin bạn muốn lên hàng đầu không.
Jimmy Hoffa

Nó giống như Project Euler và Jimmy Hoffa nói: Có một cách rất hiệu quả để giải quyết vấn đề mà không cần thử mọi tuyến đường.
WuHoUnited

-1

Thuật toán của Dijkstra cho các đường dẫn ngắn nhất (biến tất cả các cạnh âm).


5
Bạn có thể dài dòng hơn một chút trong câu trả lời của bạn. Ngay cả một liên kết đến thuật toán của Dijkstra cũng sẽ hữu ích hơn.
Martijn Pieters

-1

Cách tiếp cận tham lam chắc chắn không phải là cách tiếp cận bạn nên xem xét cho vấn đề này. Hãy nghĩ về một giải pháp kiểm tra toàn diện tất cả các tuyến đường có thể và tìm ra mức tối đa. Sau đó tối ưu hóa nó bằng cách sử dụng lập trình động .

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.