首页 > 代码库 > Project Eluer - 18
Project Eluer - 18
Maximum path sum I
Problem 18
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)
翻译:
先来看4行的三角形,从顶点3开始,只能访问它的左下角或者右下角这的两个数,依次类推,找出图中的一跳路径,使得路径上的所有数的和最大。例子中是:3+7+4+9=23. 请找出下面15行三角形中最大的路径。
(请注意,这里是求所有路径中最大的,不是求一次遍历到末尾最大的,意思就是说:不一定二叉树的下一个节点大,那么路径就大,要求的是路径上所有数之和最大的路径)
解法:这里穷举当然是最简单的方案,图中是一个二叉树,如果用数组来存的话,那就是:
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}
};
从arr[0][0]开始,它的左孩子是array[1][0], 右孩子是 array[1][1], 规律是: array[i][j] 的左孩子是 array[i+1][j], array[i+1][j+1]. 知道这个就简答了,我们用递归求出所有路径的的和,然后求一个最大值就搞定,代码如下:
package projectEuler; public class Problem18 { private static final int SIZE = 15; private static int mResult; 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} }; public static void main(String[] args) { traversal(0,0,array[0][0]); 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]); } }
由于这里只需要求出 路径额最大值,不需要输出路径,所以我们也不需要求具体的路径,我们只需要关心遍历到最低层的时候,如果这条路径的和比我们记录中最大的路径和还大,那么就替换最大路径。思路很简单
Project Eluer - 18