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: Memory Limit Exceeded)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;

public class Main{
	public static void main(String[] args)throws IOException{
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader reader = new BufferedReader(isr);
		ArrayDeque<int[]> que = new ArrayDeque<int[]>();
		Main app = new Main();
		String string;
		
		int map[][] = new int[100][100], max = 0, y = 0, x = 0, sum = 0, res = 0;
		while((string = reader.readLine()) != null){
			if(string.length() == 0) break;
			int hoge[] = app.splitter(string);
			max = max > hoge.length ? max : hoge.length;
			int i = 0;
			for(int var : hoge){
				map[max - 1 - i][max - hoge.length + i] = var;
				i++;
			}
		}
		
		que.addLast(new int[]{y , x, map[y][x]});
		while(!que.isEmpty()){
			y = que.getFirst()[0];
			x = que.getFirst()[1];
			sum = que.getFirst()[2];
			que.removeFirst();
			
			if(res < sum) res = sum;
			
			if(y + 1< max){ que.addLast(new int[]{y + 1, x, sum + map[y + 1][x]}); }
			if(x + 1< max){ que.addLast(new int[]{y, x + 1, sum + map[y][x + 1]}); }
		}
		System.out.println(res);
		reader.readLine();
	}
	
	public int[] splitter(String source){
		String str[] = source.split(",");
		int hoge[] = new int[str.length];
		for(int i = 0; i < str.length; i++)
			hoge[i] = Integer.valueOf(str[i]);
		return hoge;
	}
}