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 NOTE
nó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);
}
}
}