【发布时间】:2020-11-07 00:47:23
【问题描述】:
考虑一个 n*m 矩阵。假设矩阵中的每个单元格都分配了一个值。我们可以从矩阵第一行的每个单元格开始。允许的移动是对角向左、向下或对角向右,即从位置(i, j) 下一步移动可以是(i+1, j),或(i+1, j+1),或(i+1, j-1)。 (当然如果索引不在数组的范围之外)
添加一个额外的限制:只允许通过(至少一次)所有列的路径。
找到满足允许移动的元素的最大总和。 例如矩阵:
1 15 2
9 7 5
9 2 4
6 9 -1
总和是相等的:
28
因为路径是15+5+2+6=28。
主要特点是我需要使用动态方法。对于我可以做的所有列没有限制的任务:
var matrix = new int[,]{ { 1, 15, 2 }, //start matrix
{ 9, 7, 5 },
{ 9, 2, 4},
{ 6, 9, -1 } };
long n = matrix.GetLength(0);
long m = matrix.GetLength(1);
var sum = new List<long[]>(); // list [n][m] of maxsums
for (int i = 0; i < n; i++)
{
sum.Add(new long[m].Select(e => e = long.MinValue).ToArray());
}
for (int i = 0; i < m; i++)
{
sum[0][i] = matrix[0, i]; //sums at first line equal first line in matrix
}
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < m; j++)
{
if (j > 0) sum[i + 1][j - 1] = Math.Max(sum[i][j] + matrix[i + 1, j - 1], sum[i + 1][j - 1]); // diagonally left
sum[i + 1][j] = Math.Max(sum[i][j] + matrix[i + 1, j], sum[i + 1][j]); // downwards
if (j < m - 1) sum[i + 1][j + 1] = Math.Max(sum[i][j] + matrix[i + 1, j + 1], sum[i + 1][j + 1]); //diagonally right
}
}
long max = sum[(int)n - 1].Max(); //maximum sum among all paths (answer)
对于同一个矩阵,最大和将等于:
42
因为路径是15+9+9+9=42
现在我可以计算所有路径的动态矩阵和有限制的总和吗?
【问题讨论】:
-
又是九月了吗?
-
我不知道 28 的结果是怎样的。你能显示你要求和的数字吗
-
我认为路径是15+5+2+6=28
-
不需要从第一行开始吗?
-
我需要。起始线是 - 1 15 2
标签: c# matrix dynamic-programming