Problem:
最短経路

図１に例示するように整数（0 以上 99 以下）をひしがたに並べます。このような、ひしがたを表すデータを読み込んで、一番上からスタートして一番下まで次のルールに従って進むとき、通過する整数の和の最大値を出力するプログラムを作成してください。

各ステップで、対角線上の左下か対角線上の右下に進むことができます。

例えば図1の例では、図2に示すように、7,3,8,7,5,7,8,3,7を選んで通ったとき、その和は最大の 55 （7+3+8+7+5+7+8+3+7=55） となります。

Input

入力例に示すように、カンマで区切られた整数の並びが、ひし形状に与えられます。各行に空白文字は含まれません。入力例は図１に対応しています。
データの行数は 100 行未満です。

Output

ルールに従って通過する整数の和の最大値を１行に出力します。

Sample Input

7
3,8
8,1,0
2,7,4,4
4,5,2,6,5
2,7,4,4
8,1,0
3,8
7

Sample Output

55

Solution in JAVA (judge verdict: Accepted)

//Volume0-0089
import java.util.Scanner;

public class Main {

    //declare
	private static final int     WIDTH  = 50,
			                     HEIGHT = 99;
	private static       int     l;
    private static       int[][] route  = new int[HEIGHT][WIDTH],
    		                     table,
   		                         cost;

	public static void main(String[] args){

        String[] s;

        //input
        Scanner sc = new Scanner(System.in);

        int i;
        for(i=0;sc.hasNext();i++){
        	s = sc.nextLine().split(",");
        	for(int j=0;j<s.length;j++){
        		route[i][j] = Integer.parseInt(s[j]);
        	}
        }
        chg_tbl(i);

        //calculate,output
        System.out.println(dp());
	}

	private static void chg_tbl(int line_cnt){

		l = line_cnt/2+1;
		table = new int[l][l];

		for(int i=0;i<l;i++){
			for(int j=0;j<l-i;j++){
				table[i][j] = route[i+j][j];
			}
		}

		for(int i=1;i<l;i++){
			for(int j=l-i;j<l;j++){
				table[i][j] = route[i+j][l-i-1];
			}
		}
	}

	private static int dp(){

		int L = l+1;
		cost = new int[L][L];

		for(int i=1;i<L;i++){
			for(int j=1;j<L;j++){
				if( cost[i-1][j] > cost[i][j-1]){
					cost[i][j] = cost[i-1][j] + table[i-1][j-1];
				} else {
					cost[i][j] = cost[i][j-1] + table[i-1][j-1];
				}
			}
		}
		return cost[l][l];
	}
}