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

Java 矩阵中从左到右的最大和,java,matrix,Java,Matrix,计划规格: 在一个矩阵中,你从最左边列的一个点开始,从那里你可以朝三个方向走:右,右上对角线,右下对角线(即从点(i,j)你可以走到:(i,j+1),(i-1,j+1)(i+1,j+1) 停在矩阵末尾(最右侧) 确定最佳路径,使通过的值之和最高,然后打印最高的和 我的问题是:我为此程序编写了一个方法,但它并不是在所有情况下都返回正确的值。我需要帮助修改我的方法,使其适用于所有情况 这是我的代码: //Matrix size boundaries int x,y; //read x and

计划规格:

  • 在一个矩阵中,你从最左边列的一个点开始,从那里你可以朝三个方向走:右上对角线右下对角线(即从点(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;
        }
    }
输出为17。这是正确的。 7,2,8是产量最高的路径

对于矩阵:

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

输出为29。路径7、6、8的正确输出为21。

这确实是一个图论问题(尽管也可能有动态规划解决方案)。下面是如何思考图论问题:

  • 如何将输入转换为图形(节点+边)在这种情况下,节点相当简单——矩阵中的每个条目都是一个节点。对于边,考虑游戏的规则——你只允许向右、直立或向右移动。因此,在构造图时,将每个节点的边缘添加到右、直立和右下的三个节点。
  • 什么是最佳标准?对于给定的路径,什么决定了该路径是否理想?在这种情况下,我们寻找的是最大的求和值
  • 有没有担心无限循环?在这种情况下没有,因为所有边都必须向右移动(防止循环)。这加上图形是有限的,这意味着所有路径也将是有限的
  • 总而言之,您应该创建一个存储矩阵并将游戏规则内部化的图形(以右/正/向下移动为例),然后编写一个路径查找算法,该算法将返回图形上的最大值路径


    Dijkstra的一般解决方案当然适用于您的问题,但您可能可以走一些弯路,因为您知道任何路径中每个节点的索引都等于其列号。因此,您只需沿着每列查找通过该节点的最佳路径,方法是取其三个可能的p中的最大值REDECESSOR(left、upleft、DOWNLEVT),然后在最后一列中取这些值的最大值。这将导致更动态的编程,仅在一个图上。

    这是一个经典的图论问题:)您需要从左到右的“最昂贵路径”。灵感来源:谢谢,我来看看。在我看来,它更像是一个最大流,而不是单个源的“最大”距离。我正在寻找一种递归方法,以指定的方式遍历矩阵并确定最高和。迪克斯特拉相当复杂。我不得不以某种方式修改我的方法。看起来你实现了一个贪婪算法,它不一定会产生最佳输出。考虑两个数字序列7->7->1和7->6->7。