设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值。从顶点出发,可以向左走,也可以向右走。如图所示。问题:当三角形数塔给出之后,找出一条从第一层到达底层的路径,使路径的值最大。若这样的路径存在多条,任意给出一条即可。
我们从下往上开始选取,每次选取第i个都是下面一行的第i个或第i+1个,为了避免超出数组,我们把数组开大两个,使它的左右都为0,其实也选取不到它,因为这树上的数一定比0大,另外我们创建一个path数组来记录选中的值,以下是代码
import java.util.Scanner;
public class Main {
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int arr[][] = new int[6][6];
int dp[][] = new int[6][6];
int path[][] = new int[6][6];
arr[1][1] = 13;
arr[2][1] = 11;arr[2][2] = 8;
arr[3][1] = 12; arr[3][2] = 7;arr[3][3] = 26;
arr[4][1] = 6;arr[4][2] = 14;arr[4][3] = 15;arr[4][4] = 8;
arr[5][1] = 12;arr[5][2] = 7;arr[5][3] = 13;arr[5][4] = 24; arr[5][5] = 11;
for (int j = 1; j <= 5; j++) {
dp[5][j] = arr[5][j];
}
for (int i = 4; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
if (dp[i + 1][j] > dp[i + 1][j + 1]) {
dp[i][j] = arr[i][j] + dp[i + 1][j];
path[i][j] = j;
} else {
dp[i][j] = arr[i][j] + dp[i + 1][j + 1];
path[i][j] = j + 1;
}
}
}
int maxPath = dp[1][1];
System.out.println(maxPath);
int col = 1;
for (int row = 1; row <= 5; row++) {
System.out.print(arr[row][col] + " ");
col = path[row][col];
}
}
}
输出后为
86
13 8 26 15 24