從下面展現的三角形的頂端出發,不斷移動到下一行與其相鄰的元素,可以獲得的最大路徑和數組
3spa
7 4code
2 4 6blog
8 5 9 3遞歸
如上圖,最大路徑和爲3 + 7 + 4 + 9 = 23it
求從下面展現的三角形頂端出發到達底部,可以獲得的最大路徑和:io
15
47 , 62
26 , 71 , 37
81 , 55 , 40 , 17
17 , 66 , 54 , 66 , 10
31 , 66 , 37 , 54 , 52 , 10
72 , 39 , 85 , 57 , 78 , 17 , 63
71 , 96 , 70 , 81 , 68 , 79 , 18 , 13
29 , 31 , 40 , 96 , 67 , 3 , 10 , 82 , 49
58 , 65 , 73 , 90 , 30 , 76 , 24 , 71 , 51 , 67
87 , 55 , 52 , 85 , 38 , 8 , 43 , 11 , 32 , 20 , 79
44 , 10 , 6 , 56 , 33 , 5 , 26 , 34 , 34 , 1 , 83 , 66
44 , 28 , 54 , 25 , 2 , 20 , 57 , 23 , 43 , 40 , 12 , 49 , 58class
答案是:15 + 62 + 71 + 55 + 66 + 66 + 85 + 81 + 96 + 90 + 85 + 56 + 25 = 853test
程序:程序
1 static int[] array = { 2 15 , 3 47 , 62 , 4 26 , 71 , 37 , 5 81 , 55 , 40 , 17 , 6 17 , 66 , 54 , 66 , 10 , 7 31 , 66 , 37 , 54 , 52 , 10 , 8 72 , 39 , 85 , 57 , 78 , 17 , 63 , 9 71 , 96 , 70 , 81 , 68 , 79 , 18 , 13 , 10 29 , 31 , 40 , 96 , 67 , 3 , 10 , 82 , 49 , 11 58 , 65 , 73 , 90 , 30 , 76 , 24 , 71 , 51 , 67 , 12 87 , 55 , 52 , 85 , 38 , 8 , 43 , 11 , 32 , 20 , 79 , 13 44 , 10 , 6 , 56 , 33 , 5 , 26 , 34 , 34 , 1 , 83 , 66 , 14 44 , 28 , 54 , 25 , 2 , 20 , 57 , 23 , 43 , 40 , 12 , 49 , 58 15 };
1 public void testMaxPathSum() { 2 System.out.println(MaxPathSum(0,0)); 3 } 4 public int MaxPathSum(int row,int col) { 5 if(row<13&&col<13) { 6 int left = MaxPathSum(row+1,col); 7 int right = MaxPathSum(row+1,col+1); 8 return array[position(row,col)]+(left>right?left:right); 9 } 10 return 0; 11 } 12 public int position(int row,int col) { 13 int position = 0; 14 for(int i=0;i<=row;i++) { 15 position +=i; 16 } 17 return position+col; 18 }
分析:
實際上是將數組展開成三角形,首先根據行和列計算出在數組中的位置。先計算最低端的,經過往上遞歸找到最大值。這裏的left至關於他左邊的那天路徑,right至關於他右邊的路徑