昨天我的一位朋友遇到了一个问题,请我找到解决方案。
问题
我有matrix(n x m)
。我需要找出从这些矩阵元素中可以产生的最小和。
条件是:
经过几个小时的挣扎,我能找到一个模式。但我不知道如何在代码中实现它。
这是我的模式:
我该如何实现?
修改:
$Cost = array();
for ($x = 0; $x < $rows; $x++) {
$Cost[0][$x] = $matrix[0][$x];
for ($y = 1; $y < $cols; $y++) {
$Cost[$y][0] = $matrix[$y][0];
}
}
for ($x = 1; $x < $rows; $x++) {
for ($y = 1; $y < $cols; $y++) {
$Cost[$x][$y] = intval($matrix[$x][$y]) + min(intval($Cost[$x - 1][$y]), intval($Cost[$x][$y - 1]));
}
}
矩阵阵列I&#39; m尝试:
array(2) { [0]=> array(3) { [0]=> string(1) "3" [1]=> string(2) "44" [2]=> string(2) "75" } [1]=> array(3) { [0]=> string(2) "21" [1]=> string(2) "98" [2]=> string(2) "60" } }
结果:
array(3) { [0]=> array(2) { [0]=> string(1) "3" [1]=> string(2) "44" } [1]=> array(3) { [0]=> string(2) "21" [1]=> int(119) [2]=> int(0) } [2]=> array(1) { [0]=> NULL } }
答案 0 :(得分:6)
似乎你只能向右和向下走。对于这种情况(否则使用路径查找算法)请注意,您可以从上部单元格或左侧单元格进入每个单元格。从这些值开始,这个单元格最便宜的路径将是最小的。因此DP解决方案可能看起来像(伪代码):
请点击此处更正
Cost[0, 0] = matrix[0, 0]
for x = 1 to cols - 1
Cost[0, x] = matrix[0, x] + Cost[0, x-1] //0th row
for y = 1 to rows - 1
Cost[y, 0] = matrix[y, 0] + Cost[y-1, 0] //0th column
//proper filling of 0th row and 0th column
for y = 1 to rows - 1
for x = 1 to cols - 1
Cost[y, x] = matrix[y, x] + Min(Cost[y-1, x], Cost[y, x-1])
然后成本[n-1,n-1]就是你需要的
答案 1 :(得分:1)
更新 MBo 的答案。给定n * m(n = 3,你的帖子中m = 4)通过仅记住前一行(列)的结果,消耗的空间可以减少到O(N)。
Cost[0] = matrix[0, 0]
for x = 1 to m - 1
Cost[x] = matrix[0, x] + Cost[x-1]
for y = 1 to n - 1
Cost[0] += matrix[y, 0]
for x = 1 to m - 1
Cost[x] = matrix[y, x] + Min(Cost[x-1], Cost[x])
output(Cost[n-1])
不知道如何用PHP编写...这里的python示例代码
matrix = [
[3, 44, 75],
[21, 98, 60],
]
n = len(matrix)
m = len(matrix[0])
cost = [0] * m
cost[0] = matrix[0][0]
for x in xrange(1, m):
cost[x] = matrix[0][x] + cost[x-1]
for y in xrange(1, n):
cost[0] += matrix[y][0]
for x in xrange(1, m):
cost[x] = matrix[y][x] + min(cost[x-1], cost[x])
print cost[-1]