Problem:
Maximum Sum Sequence II

与えられた整数の行列

a1,1 a1,2 ... a1,n
a2,1 a2,2 ... a2,n
:
an,1 an,2 ... an, n

で、縦・横方向に１つ以上連続した項（部分行列）の和の最大値を出力して終了するプログラムを作成して下さい。

Input

入力データは以下の形式で与えられます。

n
a1,1 a1,2 ... a1,n
a2,1 a2,2 ... a2,n
:
an,1 an,2 ... an, n

n は 1 以上 100 以下、ai,j は -10000 以上 10000 以下です。

Output

最大値を 1 行に出力して下さい。

Sample Input 1

3
1 -2 3
-4 5 6
7 8 -9

Output for the Sample Input 1

16

この入力の場合、以下の部分行列の項の和が最大となります。

-4 5
7 8

Sample Input 2

4
1 3 -9 2
2 7 -1 5
-8 3 2 -1
5 0 -3 1

Output for the Sample Input 2

15

この入力の場合、以下の部分行列の項の和が最大となります。

7 -1 5
3 2 -1

Solution in C# (judge verdict: Accepted)

using System;

public class Hello
{
    public static void Main()
    {
        var n = int.Parse(Console.ReadLine().Trim());
        var map = new int[n+1, n+1];
        for (int i = 0; i < n; i++)
        {
            var w = 0;
            string[] line = Console.ReadLine().Trim().Split(' ');
            for (int j = 0; j < n; j++)
            {
                map[i+1, j+1] = int.Parse(line[j]) + w;
                w = map[i+1, j+1];
            }
        }
        for (int i = 0; i < n; i++)
        {
            var w = 0;
            for (int j = 0; j < n; j++)
            {
                map[j+1, i+1] = map[j+1, i+1] + w;
                w = map[j+1, i+1];
            }
        }
        Console.WriteLine(n == 1 ? map[1,1]:getAns(map));
    }
    public static int getAns (int[,] map)
    {
        var n = map.GetLength(0);
        var ret = -999999999;
        for (int i = 1; i < n; i++)
            for (int j = i ; j < n; j++)
                for (int k = 1; k < n; k++)
                    for (int L = k; L < n; L++)
                    {
                        var w = map[j, L] - map[j, k-1] - map[i-1, L] + map[i-1, k-1];
                        ret = Math.Max(ret, w);
                    }
        return ret;
    }
}