Maximum Path Sum Iproblem 18
By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top t O 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 is only 16384 routes, it's possible to solve this problem by trying every route. However,problem, is the same challenge with a triangle containing one-hundred rows; It cannot is solved by brute force, and requires a clever method! ; o)
Translation:
First look at the 4-row triangle, starting with Vertex 3, can only access its lower-left or lower-right corner of the two numbers, and so on, to find a path in the graph, so that all the numbers on the path and the maximum. The example is: 3+7+4+9=23. Please find the largest path in the 15-row triangle below.
(Note that this is the largest of all paths, not the largest one to traverse to the end, meaning: not necessarily the next node of the binary tree is large, then the path is large, requires the path of all the number and the largest path)
Solution: Here is of course the simplest solution, the figure is a binary tree, if you use an array to save, that is:
Static int[][] Array = new int[][]{
{75},
{95, 64},
{17, 47, 82},
{18, 35, 87, 10},
{20, 4, 82, 47, 65},
{19, 1, 23, 75, 3, 34},
{88, 2, 77, 73, 7, 63, 67},
{99, 65, 4, 28, 6, 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, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31},
{4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23}
};
Starting from arr[0][0], its left child is array[1][0], the right child is array[1][1], the law is: array[i][j] The left child is array[i+1][j], array[i+1][j+1]. Knowing this is a simple answer, we use recursion to find all the paths of the and, and then ask for a maximum value to be done, the code is as follows:
Package Projecteuler;public class Problem18 {private static final int SIZE = 15;private static int mresult;static int[][] Array = new int[][]{{75},{95, 64},{17, 82},{18, 3, 65},{19, 10},{20, 4, 1, approx., 34},{88 , 2, 92},{41, 67},{99, 7, 4, 6, 16, 70, 41, 26, 56, 83, 40, 33},{41, 80, 70, 48 3, 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},{ 48},{63, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31},{4, 62, 9,, +, +, +, (+) 8, 98, 9, 4, Max, Max, string[, Max, (+), (+) (+ )};p ublic static void Main (0,0,array[0][0) {traversal ]); System.out.println ("Mresult:" +mresult);} static void traversal (int i, int j, int sum) {if (i = = SIZE-1) {if (Mresult < sum) {mresult = sum;} return;} Traversal (I+1, J, Sum+array[i+1][j]) traversal (i+1, j+1, sum+array[i+1][j+1]);}}
Since we only need to ask for the maximum value of the path, do not need the output path, so we do not have to ask for a specific path, we only have to care about when traversing to the lowest level, if this path and larger than the largest path in our record, then replace the maximum path. The idea is simple.
Project Eluer-18