通过矩阵的最低成本

时间:2017-04-20 20:33:32

标签: java algorithm matrix dynamic-programming minimum

Matrix:
6 9 3
4 8 2
3 5 10

您可以从第一行中的任何整数开始,只能向下移动矩阵并在前一个数字的左下方或右下方添加。例如,从9开始,您可以转到4,8或2。 我想出了如何得到

的结果矩阵
Matrix:
6 9 3
10 11 5
13 10 15

最短路径显然是3> 2> 5,其对应于结果矩阵上的3> 5> 10。我想在ArrayList中存储最便宜路径的坐标。在这种情况下,它将是[0,2,1,2,2,1]。这就是我到目前为止。我的问题是你在哪里将值添加到ArrayList?

     private static ArrayList<Integer> minCost(int cost[][])
    {
    ArrayList<Integer> minValues = new ArrayList<>();
    int n = cost.length;
    int m = cost[0].length;
    int i, j;
    int tc[][] = new int[m][n];

    for (i = 0; i <= n - 1; i++) {
        tc[0][i] = cost[0][i];
    }


    for (i = 1;i <= n - 1; i++) {
        for (j = 0; j <= m - 1; j++) {
            if(j ==0){
                tc[i][j] = Math.min(tc[i - 1][j], 
                        tc[i-1][j + 1]) 
                        + cost[i][j];
            }
            else if(j == m-1){
                tc[i][j] = Math.min(tc[i - 1][j - 1], 
                        tc[i - 1][j]) 
                        + cost[i][j];
            }
            else{
                tc[i][j] = min(tc[i - 1][j - 1], 
                        tc[i - 1][j], 
                        tc[i-1][j + 1]) 
                        + cost[i][j];
            }

        }
    }
            return minValues;
    }

1 个答案:

答案 0 :(得分:2)

在生成整个总成本矩阵之后,应该在数组列表中添加这些值,就像您已经完成的那样。

将从底行中具有最小总成本的位置开始重建向后路径。 这将是结果数组列表中的最后一对坐标。

之后,应确定其前身。这可以通过检查前一行中哪些相邻单元的总成本来实现,当加上当前单元的成本时,可以生成所需的总成本。

在提供的示例中,最佳路径必须最终位于单元格(2,1)的底行,因为这是底行总成本最低的单元格(总成本为10)。前一个单元格必须是total_cost = 10 - cost(2,1)= 5的单元格。在第1行的相邻单元格中有一个具有此属性的候选单元,即单元格(1,2)。

这个过程应该像这样继续,以相反的顺序逐个找到路径的单元格,直到路径完成(它到达第一行)。

一些评论:

  • 如果在某些时候有多个最佳前任候选者(两者都具有相同的总成本),则可以选择其中任何一个。它们中的每一个都会产生最佳路径,总成本相同。

  • 以所需的顺序创建最终路径,每个步骤中找到的位置可以添加到数组的前面(以避免需要在结束时执行反向)。