题目描述
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。
三角形的行数大于1小于等于100,数字为 0 - 99
输入格式:
5 //表示三角形的行数 接下来输入三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
分析
从顶点开始,求最大和。每个点都有两种选择,左下还是右下,左下和右下哪个大不知道,我们可以把下面两个点看做是新的三角形,分别求出左下三角形和右下三角形的最大路径和,那么只需选择其中较大的即可加到当前顶点即可。这是一个递归过程。
f(int[] arr,int i,int j){
return arr[i][j]+max(f(arr,i+1,j),f(arr,i+1,j+1));
}
这份伪代码未考虑递归的出口,出口就在最后一行,因为这个时候i和j都没有办法再增加,这时该顶点相当于没有继续往下走的走法,加号后面的部分略去即可。
递归代码
/**
*
* @param triangle
* 数字三角形
* @param i
* 起点行号
* @param j
* 起点列号
* @return 计算出的最大和
*/
public static int maxSumUsingRecursive(int[][] triangle, int i, int j) {
int</