矩阵中的最小路径和
Posted
技术标签:
【中文标题】矩阵中的最小路径和【英文标题】:Minimum path sum in matrix 【发布时间】:2019-10-26 11:54:47 【问题描述】:给定一个 N * M 的矩阵。求。最小路径是从第一行到最后一行的所有元素的总和,您只能向下或沿对角线向左或向右移动。您可以从第一行的任何元素开始。 我已经编写了代码,但是我的代码/逻辑有什么问题? 在我的算法中,我从顶行的元素开始,现在我要去第二行,算法正在寻找最小值并与第一个元素相加,因此它让位于底部(一个元素只能加上它下面的元素,也可以左右对角移动)
import java.util.Scanner;
public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int row, column, i, j,temp=0;
System.out.print("Please enter the desire grid dimension: ");
row = sc.nextInt();
column = sc.nextInt();
int array[][] = new int[row][column];
System.out.println("Please enter the desired input:");
for (i = 0; i < row; i++)
for (j = 0; j < column; j++)
array[i][j] = sc.nextInt();
for(i=1;i<row;i++)
for(j=0;j<column;j++)
array[i][j] += Math.min((j==0)?0:array[i-1][j-1],Math.min(array[i-1][j],(j==column-1)?0:array[i-1][j+1]));
for(i=0;i<row;i++)
for(j=0;j<column;j++)
System.out.print(array[i][j] + " ");
System.out.println();
for(j=0;j<column-1;j++)
temp = Math.min(array[row-1][j],array[row-1][j+1]);
System.out.println(temp);
让你的输入是
1 5 1 5 1* 5
3 3 2 3 3* 4
2 3 4 4 3 2*
2 2 3 2 2* 4
2 2 4 3 4 2*
4 4 4 4 2* 3
你的输出应该是 12,路径标有 (*) 1+3+2+2+2+2=12
我得到 3,因为在运行我的算法后,矩阵变成了
1 5 1 5 1 5
3 4 3 4 4 4
2 6 7 7 7 2
2 4 9 9 4 4
2 4 8 7 8 2
4 6 8 11 4 3
【问题讨论】:
【参考方案1】:我没有给你一个完整的答案。你会从发现自己中学到更多。同时这对你来说也会更令人欣慰。所以我会在路上稍微引导你,相信你自己做剩下的。没那么难。
然而,首先,为了让其他读者能够理解我所写的内容,我需要给出你应该在你的算法应该如何工作的问题中给出的解释。您正在以某种方式修改矩阵,以便每个单元格而不是其原始数字包含从顶部到该单元格的路径的最小总和。例如:
在算法运行后,我们从您的矩阵中看到顶行没有改变。这是正确,因为您可以直接进入每个单元格,因此总和等于原始单元格值。 在第二行中,第二个(索引 1)单元格已从 3 更改为 4。这是正确,因为要转到该单元格,我们需要通过 1 或 5 或 1第一行。 1 给出最小和,因此 1 与 3 相加,因此为 4。 在同一行中,最左边的单元格没有改变 3. 不正确。要到达这个单元格,您还需要通过第一行中的 1 或 5,所以这 3 也应该更改为 4。我将给您一条信息:该单元格没有被遗忘。您的循环为单元格分配了一个值,但不是正确的值。应该添加 1,而不是添加 0。这个 0 是从哪里来的?轮到你!调试愉快。【讨论】:
以上是关于矩阵中的最小路径和的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp [dp] [path] [matrix]具有非负数的2d矩阵/网格中的最小路径和。找到从左上角到右下角的路径,最小化
c_cpp [dp] [path] [matrix]具有非负数的2d矩阵/网格中的最小路径和。找到从左上角到右下角的路径,最小化