以最低成本记录最佳网格路径

时间:2017-10-06 16:06:56

标签: java algorithm dynamic dynamic-programming

所以我有一个2D矩阵,我应该记录给出最低成本的路径。我只能向下或向右移动。例如:

2 4 1
3 7 6
3 8 9

Output: right right down down

我的代码给出了错误的答案,但我无法找出原因。我还附上了我的代码:

public static List<String> optimalGridPath(int[][] grid) {

    ArrayList<String> answers = new ArrayList<String>();
    //TODO
    int gridRows = grid.length-1;
    int gridColumns = grid[0].length-1;

    int solutionGrid[][] = new int[gridRows+1][gridColumns+1];

    for (int i = 0; i <= gridRows; i++) {
        for (int j = 0; j <= gridColumns; j++) {
            if (i > 0 && j > 0)
                solutionGrid[i][j] = grid[i][j] +
                        Math.min(solutionGrid[i-1][j], solutionGrid[i][j-1]);
            else if (j == 0 && i == 0)
                solutionGrid[i][j] = grid[i][j];
            else if (j > 0)
                solutionGrid[i][j] = grid[i][j] + solutionGrid[i][j-1];
            else
                solutionGrid[i][j] = grid[i][j] + solutionGrid[i-1][j];
        }
    }

    while (gridRows != 0 && gridColumns != 0) {
        if (gridColumns == 0) {
            answers.add("down");
            gridRows--;
        }
        else if (gridRows == 0) {
            answers.add("right");
            gridColumns--;
        }
        else {
            if (solutionGrid[gridRows][gridColumns-1] <
                    solutionGrid[gridRows-1][gridColumns]) {
                answers.add("right");
                gridColumns--;
            }
            else {
                answers.add("down");
                gridRows--;
            }
        }
    }

    return answers;
}

1 个答案:

答案 0 :(得分:1)

解决方案的第一部分似乎是正确的,但第二部分则不正确。

执行嵌套for循环后,您的solutionGrid中的每个位置都将填充到达该位置的最低成本。

因此,要确定从开始到结束的最低成本路径,您应该从结束开始,然后向左或向上移动直到您到达开始。当解决方案网格中当前位置左侧的位置小于当前位置上方的解决方案网格中的位置时,您应该向左移动。

您已经完成了这项工作,但是您声明正在向右或向下移动,而不是声明正确的路径向左或向上移动。

因为你的答案清单应该规定如何从一开始就完成,你的答案清单是正确的,但顺序相反。

通过调用

修复程序
tsc

answers.insert(0, "right")

而不是使用&#34;添加&#34;方法 - 将附加到数组列表的末尾。