通过矩阵的最小成本

Posted

技术标签:

【中文标题】通过矩阵的最小成本【英文标题】:Min Cost through a Matrix 【发布时间】:2017-09-17 16:06:03 【问题描述】:
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】:

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

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

之后,应确定其前身。这可以通过检查前一行中哪个相邻单元格的总成本来完成,当该总成本添加到当前单元格的成本时,会生成所需的总成本。

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

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


一些备注:

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

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

李>

【讨论】:

在构建列表时,您只需查看上面行中的 2-3 个相邻值,而不是全部,它是这些值的最小值。 是的,谢谢,我加了关键字“相邻”来说明清楚。

以上是关于通过矩阵的最小成本的主要内容,如果未能解决你的问题,请参考以下文章

如何获得在图中将某个节点彼此断开连接的最小成本

在 Matlab 中用 SVM 编写成本函数的正确方法 - 无法理解“成本”矩阵

在 C++ 中通过网格/矩阵找到成本优化路径

64.Minimum Path Sum

64.Minimum Path Sum

以最小成本断开无向加权图中的两个节点