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

标签 java algorithm dynamic dynamic-programming

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

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;
}

最佳答案

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

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

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

你已经这样做了,但你并没有声明正确的路径是向左或向上移动,而是声明你正在向右或向下移动。

因为您的答案列表应该规定如何从头开始到达终点,所以您的答案列表是正确的,但顺序相反。

通过调用修复你的程序

answers.insert(0, "right")

answers.insert(0, "down")

而不是使用“添加”方法 - 它将附加到数组列表的末尾。

关于java - 以最低成本记录最佳网格路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46609802/

相关文章:

java - 如何告诉 web.xml 它不应该处理 .htc 文件并将它们留给 Web 服务器?

java - 传递给调用方法的命令行参数

r - 如何分解一个大整数

algorithm - 如何得到一组集合的所有组合?

c++ - 如何为指向数组的指针执行 memset?

java - 无法初始化类 javax.crypto.SunJCE_b

JavaFx Webview转到移动站点-(使用jdk 7)

c++ - 如何检查 x-y 轴上的碰撞

php - 动态添加用户特定类

C# 4.0 动态对象和 WinAPI 接口(interface),如 IShellItem(无需在 C# 源代码中定义它们)