项目欧拉#18:最大路径总和I.

时间:2015-03-14 00:23:20

标签: 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 {
        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)。我添加了一个打印声明,看看它选择了什么数字,它让它们变好了(基于我如何理解我想要找到的东西)但我仍然弄错了......任何人都知道为什么?

1 个答案:

答案 0 :(得分:0)

我已经有一段时间了,因为我已经解决了这个问题,但是你会发现从三角形底部开始并向前迈进是最好的。特别是,当你遇到问题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.

现在向上移动一行并执行相同的检查,直到你到达最顶层,顶部应该包含正确的答案。