82 Path Sum Three Ways

原题链接

从矩阵的左边一行的任意一个元素开始,可以往上、往下、往右前进,到达最右边的某个元素为止。由此形成了一条路径,要求使得该路径上的数字之和最小。

题中的 的矩阵可以用于测试和 debug,最后要求给出答案的是一个 的矩阵。

这是一道典型的动态规划题目。

初始化一个 的二维数组用于保存结果。第一列就是矩阵的第一列。

然后从 列向 列前进。

考虑第 行,可以是从 列的任何一个位置 向上或者向下到达第 行,然后向右平移过来,选择和最小的记录在第 列第 行。

三层循环,将 的二维数组填满。

最后要的最小路径和就是最后一列值最小的一个数字。

整个题目不难,代码如下:

long[,] sums = new long[dim, dim];
for (int i = 0; i < dim; i++)
{
    sums[i, 0] = matrix[i, 0];
}

for (int j = 1; j < dim; j++)
{
    // from column j-1 to column j
    for (int i = 0; i < dim; i++)
    {
        // consider row i
        long min = long.MaxValue;
        for (int k = 0; k < dim; k++)
        {
            long temp = sums[k, j - 1] + matrix[i, j];
            int begin;
            int end;
            if (k < i)
            {
                begin = k + 1;
                end = i;
            }
            else
            {
                begin = i;
                end = k - 1;
            }
            for (int index = begin; index <= end; index++)
            {
                temp += matrix[index, j - 1];
            }

            if (temp < min)
            {
                min = temp;
            }
        }

        sums[i, j] = min;
    }
}

var lastColumn = new List<long>();
for (int i = 0; i < dim; i++)
{
    lastColumn.Add(sums[i, dim - 1]);
}

return lastColumn.Min().ToString();