Вчера один из моих друзей пришел с проблемой, попросив меня найти решение.
Проблема
У меня есть matrix(nxm)
. Мне нужно узнать наименьшую сумму, которую я могу произвести из этого матричного элемента.
Условие:
После нескольких часов работы я смогу найти образец для этого. Но я не знаю, как реализовать его в коде.
Вот мой пример:
Как я могу это реализовать?
Редактировать :
$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])); } }
Матричный массив Я пытаюсь:
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 } }
Кажется, что вы можете идти только вправо и вниз. Для этого случая (в противном случае используйте алгоритмы поиска пути) обратите внимание, что вы можете войти в каждую ячейку либо из верхней ячейки, либо из левой ячейки. Самый дешевый путь к этой ячейке будет минимальным из этих значений. Таким образом, решение 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] – это то, что вам нужно
Обновление для ответа MBo . Учитывая * 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]