Java 项目18:最大路径和I

Java 项目18:最大路径和I,java,Java,所以基本上我对这个问题的解释如下: 3 7 4 2 4 6 8 5 9 3 应比较起点以下的两个数字,并选择较大的数字作为新数字。在这种情况下,它是3,然后是7,然后是4,然后是9。把它们加起来,得到23的答案。我编写了一个程序来实现这一点: public class ProblemEighteen { private static int pos = 1; public static void main(String[] args) { try { S

所以基本上我对这个问题的解释如下:

   3
  7 4
 2 4 6
8 5 9 3
应比较起点以下的两个数字,并选择较大的数字作为新数字。在这种情况下,它是3,然后是7,然后是4,然后是9。把它们加起来,得到23的答案。我编写了一个程序来实现这一点:

public class ProblemEighteen {

private static int pos = 1;

public static void main(String[] args) {
    try {
        Scanner in = new Scanner(new File("Problem18Text"));
        int sum = 0;
        while (in.hasNextLine()) {
            final String line = in.nextLine();
            int big = getBiggestNum(line);
            sum += big;
            System.out.println(big);
        }
        System.out.println(sum);
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private static int getBiggestNum(String line) {
    final String[] numbers = line.split(" ");
    if (numbers.length == 1) {
        pos = 1;
        return Integer.parseInt(numbers[0]);
    } else {
        int i = 1;
        int numOne = -1;
        int numTwo = -1;
        for (final String num : numbers) {
            if (pos == i) {
                numOne = Integer.parseInt(num);
            } else if (pos + 1 == i) {
                numTwo = Integer.parseInt(num);
            }
            i++;
            if (numOne != -1 && numTwo != -1)
                break;
        }
        if (numOne > numTwo) {
            return numOne;
        } else {
            pos += 1;
            return numTwo;
        }
    }
}

对于我上面给出的例子来说,它工作得很好,但是当我把实际的问题放进去解决时,它说我搞错了,我得到了1064。我添加了一个打印语句来查看它选择了什么数字,它根据我如何理解我试图查找的内容来确定它们是否正确,但我仍然错了。。。有人知道为什么吗?

我已经有一段时间没有解决这个问题了,但是你会发现最好从三角形的底部开始,然后逐步向上。特别是当你遇到问题67时

如果按照baum的建议将数据读入数组,则会得到如下数据:

3  0  0  0
7  4  0  0
2  4  6  0
8  5  9  3
因此,从底部开始,一次取两个数字,并将总和与上面下一行的相邻数字进行比较

8 + 2 = 10 or 5 + 2 = 7.  10 is greater so replace the 2 with the 10.  
5 + 4 = 9 or 9 + 4 = 13.  13 is greater so replace the 4 with the 13.
9 + 6 = 15 or 3 + 6 = 9.  15 is greater so replace the 6 with 15.

现在上移一行,执行相同的检查,直到到达最顶端,最顶端应该包含正确的答案。

你真的很接近了。不太清楚它为什么不起作用,但为了让自己不那么头疼,你可能希望在开始时将整个三角形读入一个数组,而不是在整个程序中处理字符串。鲍姆:噢,哇,我感觉很好,我真的很接近了!我将把它从操作字符串改为基于数组的操作,以清除代码,然后我应该能够更轻松地诊断问题。当我从机场回来后,我会更新OP。另一个评论,但它不一定会修复它:看起来你不应该使用增强的for-for-each循环。我想你有柜台。所以只要使用一个常规的for循环,你对这个问题的解释是错误的。考虑这个三角形:1 \ N1 2 \ N9 1×2的解是11,但是您的算法给出了5。你需要从下到上阅读三角形,并使用动态编程来解决这个问题,这很简单,不是吗,但在这种情况下,你找到的是最长的路径,不熟悉Floyd的算法。如果你查看我发布的链接,你会发现Floyd的算法是一种用于加权有向图的最短路径查找算法,这基本上就是三角形。您可以修改算法中的比较,使其成为最长路径,这与您在答案中建议的非常相似