描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
图1
图1显示了一个数字三角形。编写一个程序,计算在从顶部开始到底部某处结束的路由上传递的数字的最大和。
每一步都可以向左斜下或向右斜下。
输入
你的程序是从标准输入读取。第一行包含一个整数N:三角形中的行数。下面的N行描述了三角形的数据。三角形中的行数大于1,但小于等于100。三角形中的所有整数都在0到99之间。
输出
您的程序将写入标准输出。最高和被写成整数。
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
package basic_data_structure; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; /** * @author XA-GDD * */ public class F_TheTriangle { static int N; static int [][]arr; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str ; StringTokenizer st; while((str = br.readLine()) != null ) { if("".equals(str)) break; st = new StringTokenizer(str); N = Integer.parseInt(st.nextToken()); arr = new int[N+1][N+1]; for(int i=1;i<=N;i++) { st = new StringTokenizer(br.readLine()); int cnt =st.countTokens(); for(int j=1;j<=cnt;j++) { arr[i][j] = Integer.parseInt(st.nextToken()); } } for ( int i = N-1 ; i >= 1 ; i--){ //i反向,不会影响第i-1行的值,因为要计算左上角的值,所以i=1,j=1开始存有效值 for ( int j = 1 ; j <= i ; j++){ arr[N][j] = Math.max(arr[N][j],arr[N][j+1]) + arr[i][j]; } } System.out.println(arr[N][1]); } } }