问题描述
(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
.
(图3.1-1)
径,使该路径所经过的数字的总和最大。
●每一步可沿左斜线向下或右斜线向下走;
●1<三角形行数≤100;
●三角形中的数字为整数0,1,…99;
.
(图3.1-1)
输入格式
文件中首先读到的是三角形的行数。
接下来描述整个三角形
接下来描述整个三角形
输出格式
最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
首先想到递归,但是,会运行超时。
递归:
1 import java.text.DecimalFormat; 2 import java.text.NumberFormat; 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 import java.util.Stack; 6 public class Main{ 7 public static int n; 8 public static void main(String[] args){ 9 Scanner input = new Scanner(System.in); 10 n = input.nextInt(); 11 int[][] a = new int[n][n]; 12 for(int i=0;i<n;i++){ 13 for(int j=0;j<=i;j++){ 14 a[i][j] = input.nextInt(); 15 } 16 } 17 int max = max(0,0,a); 18 System.out.println(max); 19 } 20 public static int max(int i,int j,int a[][]){ 21 if(i==n-2){ 22 return a[i][j]+Math.max(a[i+1][j], a[i+1][j+1]); 23 }else{ 24 return a[i][j]+Math.max(max(i+1,j,a), max(i+1,j+1,a)); 25 } 26 } 27 }
循环:
1 import java.text.DecimalFormat; 2 import java.text.NumberFormat; 3 import java.util.ArrayList; 4 import java.util.Scanner; 5 import java.util.Stack; 6 7 public class Main{ 8 public static void main(String[] args){ 9 Scanner input = new Scanner(System.in); 10 int n = input.nextInt(); 11 int[][] a = new int[n][n]; 12 for(int i=0;i<n;i++){ 13 for(int j=0;j<=i;j++){ 14 a[i][j] = input.nextInt(); 15 } 16 } 17 int max = 0; 18 int sum = 0; 19 for(int i=n-2;i>=0;i--){ 20 for(int j=0;j<=i;j++){ 21 a[i][j] = Math.max(a[i+1][j], a[i+1][j+1])+a[i][j]; 22 } 23 } 24 System.out.println(a[0][0]); 25 26 } 27 }