矩阵中从左到右的最大总和

时间:2014-09-24 15:40:07

标签: java matrix

计划规格:

  • 在矩阵中,您从最左侧列中的一个点开始,从那里开始,您可以向三个方向前进:右侧右上方对角线右下角(即从点(i,j)你可以去:(i,j + 1)(i -1,j + 1)(i + 1,j + 1)
  • 停在矩阵的最后(最右侧)。
  • 确定最佳路径,以便您传递的值之和最高,并打印最高总和。

我的问题是:我为这个程序编写了一个方法,但在所有情况下它都没有返回正确的值。我需要帮助修改我的方法,以便适用于所有情况。

这是我的代码:

//Matrix size boundaries
int x,y;

//read x and y...

//Matrix M
int[][] M=new int[x][y];

//read M...

//Goes through left-most column and prints highest sum of all sums returned
public void GoThroughLeftColumn()
    {
        int sum=0;
        for(int i=0;i<M.length;i++)
        {
            sum=Math.max(sum, GoThroughMatrix(i,0));
        }
        System.out.println(sum);
    }

//Returns the highest sum for point (i,j)
public int GoThroughMatrix(int i, int j)
    {
        int sum;
        //if out of matrix-->return 0
        if(i>=x||j>=y||i<0||j<0)
        {
            return 0;
        }
        else
        {
            sum=0;
            for(int line=-1;line<2;line++)
            {
                sum=Math.max(M[i][j]+GoThroughMatrix(i+line,j+1), sum);
            }

            return sum;
        }
    }

对于Matrix:

1 3 4
7 2 1
4 1 8

输出为17.这是正确的。 7,2,8是产量最高的路径

对于Matrix:

7 1 8
7 6 7
7 1 3
5 5 4

输出为29.对于路径7,6,8,正确的输出为21。

1 个答案:

答案 0 :(得分:1)

这确实是一个图论理论问题(尽管也可能存在动态编程解决方案)。以下是如何思考图论问题:

  1. 如何将输入转换为图形(节点+边缘)?在这种情况下,节点非常简单 - 矩阵中的每个条目都是一个节点。对于边缘,请考虑游戏规则 - 您只能向右,直立或彻底移动。因此,在构建图形时,将每个节点的边添加到右侧,直立和垂直的三个节点。
  2. 最佳标准是什么?对于给定的路径,决定该路径是否理想的是什么?在这种情况下,我们正在寻找最大的总和值。
  3. 是否担心无限循环?在这种情况下不,因为所有边都必须向右移动(防止循环)。这加上图表有限的事实意味着所有路径也是有限的。
  4. 总而言之,您应该创建一个存储矩阵的图形并内化游戏规则(根据右/直/右运动),然后编写路径查找算法,该算法将返回图形上的最大值路径

    Dijkstra是一般解决方案,当然适用于您的问题,但您可能会削减一些角落,因为您知道任何路径中的每个节点的索引都等于其列号。因此,您可以通过获取其三个可能的前任(左,上,下)的最大值,然后在最后一列中获取这些值的最大值,沿着每列找到通过该节点的最佳路径。这样就可以在图表上结束更多动态编程。