计划规格:
我的问题是:我为这个程序编写了一个方法,但在所有情况下它都没有返回正确的值。我需要帮助修改我的方法,以便适用于所有情况。
这是我的代码:
//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。
答案 0 :(得分:1)
这确实是一个图论理论问题(尽管也可能存在动态编程解决方案)。以下是如何思考图论问题:
总而言之,您应该创建一个存储矩阵的图形并内化游戏规则(根据右/直/右运动),然后编写路径查找算法,该算法将返回图形上的最大值路径
Dijkstra是一般解决方案,当然适用于您的问题,但您可能会削减一些角落,因为您知道任何路径中的每个节点的索引都等于其列号。因此,您可以通过获取其三个可能的前任(左,上,下)的最大值,然后在最后一列中获取这些值的最大值,沿着每列找到通过该节点的最佳路径。这样就可以在图表上结束更多动态编程。