描述
             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]);
		}
		
	}
}