Мне нужна помощь в расширении очень популярного вопроса динамического программирования. Мин. / Макс. Стоимость пути
Вопрос: существует двумерная матрица со значениями (0,1, -1).
0 -> no cherry. can go here
1 -> cherry present. can go here
-1 -> thorn present. can't go here
нам нужно напечатать максимальное количество собранных вишен и весь путь, по которому мы можем собрать максимальное количество вишен.
input :
{{0, 1, -1}, {1, 0, -1},{1,1,1}};
output :
4
(0,0) -> (1,0) -> (2,0) -> (2,1) -> (2,2)
Я могу написать код для печатимаксимум вишни собрано, но не в состоянии понять, как хранить весь путь. Так как мы решаем, какую ячейку выбрать при возврате, она кажется немного сложной. не нашел никакой веб-помощи в этом отношении. Я застрял, любая помощь будет оценена.
public int cherryPickup(int[][] grid) {
if (grid.length == 0) {
return -1;
}
int[][] dp = new int[grid.length][grid[0].length];
setDp(dp);
int forwardMax = getForwardMax(grid, dp, 0, 0);
return forwardMax;
}
private void setDp(int[][] dp) {
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
dp[i][j] = -1;
}
}
}
private int getForwardMax(int[][] grid, int[][] dp, int i, int j) {
if(dp[i][j] != -1) {
return dp[i][j];
}
if (grid[i][j] == -1) {
dp[i][j] = 0;
return dp[i][j];
}
if (i == grid.length - 1 && j == grid[0].length - 1) {
dp[i][j] = grid[i][j];
return dp[i][j];
}
if (i == grid.length - 1) {
dp[i][j] = grid[i][j] + getForwardMax(grid, dp, i, j + 1);
return dp[i][j];
}
if (j == grid[0].length - 1) {
dp[i][j] = grid[i][j] + getForwardMax(grid, dp, i + 1, j);
return dp[i][j];
}
dp[i][j] = grid[i][j] + Math.max(getForwardMax(grid, dp, i + 1, j), getForwardMax(grid, dp, i, j + 1));
return dp[i][j];
}
В соответствии с предложением в комментарии для указания пути [] [] и хранения индекса, который является максимальным. Ниже кодахранит (1,1) также 1, что неверно.
private int getForwardMax(int[][] grid, int[][] dp, int i, int j, int[][] path) {
if(dp[i][j] != -1) {
return dp[i][j];
}
if (grid[i][j] == -1) {
dp[i][j] = 0;
return dp[i][j];
}
if (i == grid.length - 1 && j == grid[0].length - 1) {
dp[i][j] = grid[i][j];
return dp[i][j];
}
if (i == grid.length - 1) {
dp[i][j] = grid[i][j] + getForwardMax(grid, dp, i, j + 1, path);
path[i][j] =1;
return dp[i][j];
}
if (j == grid[0].length - 1) {
dp[i][j] = grid[i][j] + getForwardMax(grid, dp, i + 1, j, path);
path[i][j] =1;
return dp[i][j];
}
int left = getForwardMax(grid, dp, i + 1, j, path);
int right = getForwardMax(grid, dp, i, j + 1, path);
int max = Math.max(left, right);
if(max == left) {
path[i+1][j] = 1;
} else {
path[i][j+1] = 1;
}
dp[i][j] = grid[i][j] + max;
return dp[i][j];
}