1. 问题描述:
在数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大
路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径
三角形的行数大于1小于等于100,数字为 0 - 99<br>
输入格式:
5 (表示三角形的行数 )
(接下来输入三角形)
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
要求输出最大和
2. 下面我们使用耗时更少的动态规划来进行解决,之前我们是写过普通的递归,无返回值的深度优先搜索,有返回值的深度优先搜索,记忆型的递归(有返回值的深搜)对于其中思路会比较熟悉了,这里我们使用动态规划来解决使用到另外一个思路就是谁依赖于谁,那么我们就先求解出被依赖的那个量,对于这道题目来说,上面的顶点依赖于下面的顶点,所以需要先求解出下层的这些顶点然后进行逐步逼近要求解的最大值
因为是动态规划,所以我们一定要保存历史上的最佳结果,所以使用一个二维数组来进行保存下层节点的最大值然后往上层的节点进行更新那么最后得到的顶点那么就是所有路径中的最大值了,我们可以使用excel表来帮助我们理解
3. 具体的代码如下:
import static java.lang.Math.max;
import java.util.Scanner;
public class Main {
static int triangle[][];
static int n;
static int rec[][];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
triangle = new int[n][];
rec = new int[n][];
for(int i = 0; i < n; i++){
triangle[i] = new int[i + 1];
rec[i] = new int[i + 1];
for(int j = 0; j <= i; j++){
triangle[i][j] = sc.nextInt();
}
}
int res = dp();
System.out.println(res);
sc.close();
}
private static int dp(){
int row = triangle.length;
//初始化最后一行
for(int i = 0; i < row; i++){
rec[row - 1][i] = triangle[row - 1][i];
}
for(int i = row - 2; i >= 0; i--){
for(int j = 0; j <= i; j++){
//进行更新每一个顶点
rec[i][j] = triangle[i][j] + max(rec[i + 1][j], rec[i + 1][j + 1]);
}
}
return rec[0][0];
}
}