数字三角形dfs
package _9动规;
import java.util.Scanner;
/**
* 数字三角形(POJ1163)<br>
*
* 在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。<br>
* 路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。<br>
* 三角形的行数大于1小于等于100,数字为 0 - 99<br>
* 输入格式:<br>
* 5 //表示三角形的行数 接下来输入三角形<br>
* 7<br>
* 3 8<br>
* 8 1 0<br>
* 2 7 4 4<br>
* 4 5 2 6 5<br>
* 要求输出最大和<br>
* // int[][] triangle = {
// {7},
// {3, 8},
// {8, 1, 0},
// {2, 7, 4, 4},
// {4, 5, 2, 6, 5},
// {4, 5, 2, 6, 5, 7},
// {4, 13, 12, 88, 6, 6, 5},
// {3, 8, 7, 11, 9, 22, 66, 3},*/
public class 数字三角形dfs {
public static void main(String[] args) {
/*Scanner in=new Scanner(System.in);
int n=in.nextInt();
int [][]triangle=new int[n][];
for(int i=0;i<n;i++) {
triangle[i]=new int[i+1];
for(int j=0;j<i+1;j++) {
triangle[i][j]=in.nextInt();
}
}*/
int[][] triangle = {
{7},
{3, 8},
{8, 1, 0},
{2, 7, 4, 4},
{4, 5, 2, 6, 5},
{4, 5, 2, 6, 5, 7},
{4, 13, 12, 88, 6, 6, 5},
{3, 8, 7, 11, 9, 22, 66, 3},
};
System.out.println(maxSumUsingDp(triangle, 0, 0));//传入数组 ,行下标,列下标
}
private static int maxSumUsingDp(int[][] triangle, int i, int j) {
int rowIndex = triangle.length;//行数
if (i == rowIndex - 1) {//如果到底了直接返回最后一行
return triangle[i][j];
} else {//否则进行递归
//顶点的值+max(左侧支线的最大值,右侧支路的最大值)
return triangle[i][j]
+Math.max(maxSumUsingDp(triangle, i + 1, j),//左边行加
(maxSumUsingDp(triangle, i + 1, j + 1)));//右边列加
}
}
}