原题链接:http://projecteuler.net/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)
题目大意是:
从下面的三角形的顶端开始,向下面一行的相邻数字移动,从顶端到底端的最大总和为23.
3
7 4
2 4 6
8 5 9 3
也就是 3 + 7 + 4 + 9 = 23.
找出从以下三角形的顶端走到底端的最大总和:
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
解法1:
参考自:http://www.mathblog.dk/project-euler-18/
简单地说,就是从下自上,找出那一层里的每两个数的较大者,并加到这两个数对应的上一层的那个数里。例如对于上面的小三角,第4层是8,5,9,3,而8与5这两个相邻的数,8比5大,8然后加到8,5对应的上一层的那个数2上,5和9,9和3,这两对也是如此,则小三角简化成如下所示:
3
7 4
10 13 15
一直简化到只剩下最顶层。
php代码:
$str=<<=0;$i--){
$len = count($numbers[$i]);
for($j=0;$j<$len;$j++){
$a = $numbers[$i][$j]+$numbers[$i+1][$j];
$b = $numbers[$i][$j]+$numbers[$i+1][$j+1];
$numbers[$i][$j] = max($a,$b);
}
}
var_export($numbers[0]);
注:题目的中文翻译源自http://pe.spiritzhang.com