首页 > 代码库 > 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