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 C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.Text;

namespace _089_TheShortestPathonARhombicPath
{
	class Program
	{
		static void Main ( string[] args )
		{
			//input
			string[] inputStr = new string[100];
			int inputCount = 0;

			while ((inputStr[inputCount] = Console.ReadLine ()) != null)
			{
				inputCount++;
			}

			int[][] inputNum = new int[inputCount][];

			for (int lp = 0; lp < inputNum.Length; lp++)
			{
				inputNum[lp] = Array.ConvertAll (inputStr[lp].Split (','), int.Parse);
			}

			//process
			int[][] pathTable = new int[inputCount][];
			for (int lp = 0; lp < pathTable.Length; lp++)
			{
				pathTable[lp] = new int[inputNum[lp].Length];
			}

			//top to middle
			pathTable[0][0] = inputNum[0][0];

			for (int row = 1; row <= pathTable.Length / 2; row++)
			{
				for (int col = 0; col < pathTable[row].Length - 1; col++)
				{
					int currentDistance = pathTable[row][col];
					int previousAddPathDistance = pathTable[row - 1][col] + inputNum[row][col];
					pathTable[row][col] = Math.Max (currentDistance, previousAddPathDistance);

					currentDistance = pathTable[row][col + 1];
					previousAddPathDistance = pathTable[row - 1][col] + inputNum[row][col + 1];
					pathTable[row][col + 1] = Math.Max (currentDistance, previousAddPathDistance);
				}
			}

			//middle to buttom
			for (int row = pathTable.Length / 2 + 1; row < pathTable.Length; row++)
			{
				for (int col = 0; col < pathTable[row].Length; col++)
				{
					int previousMaxDistance = Math.Max (pathTable[row - 1][col], pathTable[row - 1][col + 1]);
					pathTable[row][col] = previousMaxDistance + inputNum[row][col];
				}
			}

			//output
			Console.WriteLine (pathTable[pathTable.Length - 1][0]);
		}
	}
}