欧拉工程第18题 出从三角形顶端走到底端的最大和

来源:互联网 发布:北上战舰世界数据 编辑:程序博客网 时间:2024/05/22 12:22

题目

从下面的三角形的顶端开始,向下面一行的相邻数字移动,从顶端到底端的最大总和为23.

插图1

也就是 3 + 7 + 4 + 9 = 23.

找出从以下三角形的顶端走到底端的最大总和:

插图2

提示:以上图中共有16384条路径,所以你可以用穷举法。但是第67题是同样的题目,但是拥有100层。此时你不能再靠蛮力,你需要一个更便捷的方法。

上面贴图可能失效或者观看效果不好,你可以直接点击查看中文原题,或者点击查看英文原题。

解题方法

这题我的解法是将上一行的数据叠加到下一行,直至最后一行。以题目中的例子进行讲解。将第一行的3和第二行的7和4分别相加,得到10和7,替换原来的7和4。第二行就变成了10,7。再用新的第二行和第三行相加,结果替换第三行,需要注意的是,第三行的4可以和上一行的两个数相加,这里我们取和的较大值。最终我们获得的第三行是12,14,13。同理用新的第三行和第四行相加,获得新的第四行,是20,19,23,16
取新的第四行的最大值,即23。

如果要求最大的路径,我们可以在每次叠加时保留路径信息。

程序

程序中注意个问题,上图为了对称,小于10的数也被写成两位如08,09。但是编程语言中一般以0开头的数表示八进制数,所以08是不合法的,要去掉前面的0。

public static void solve() {    int[][] num = {            {75},            {95,64},            {17,47,82},            {18,35,87,10},            {20,04,82,47,65},            {19,01,23,75,03,34},            {88,02,77,73,07,63,67},            {99,65,04,28,06,16,70,92},            {41,41,26,56,83,40,80,70,33},            {41,48,72,33,47,32,37,16,94,29},            {53,71,44,65,25,43,91,52,97,51,14},            {70,11,33,28,77,73,17,78,39,68,17,57},            {91,71,52,38,17,14,91,43,58,50,27,29,48},            {63,66,04,68,89,53,67,30,73,16,69,87,40,31},            {04,62,98,27,23,9,70,98,73,93,38,53,60,04,23}        };    // 上一行合并的结果    int[] lastSum = new int[15];    // 下一行合并的结果    int[] nextSum = new int[15];    lastSum[0] = num[0][0];    for (int i = 1; i < num.length; i++) {        nextSum[0] = lastSum[0] + num[i][0];        for (int j = 1; j < i; j++) {            nextSum[j] = (lastSum[j - 1] > lastSum[j] ? lastSum[j - 1] : lastSum[j]) + num[i][j];        }        nextSum[i] = lastSum[i - 1] + num[i][i];        lastSum = Arrays.copyOf(nextSum, num.length);        // 调试代码,你可以在这里看到合并后新的行输出        for (int n : lastSum) {            if (n != 0)                System.out.print(n + " ");        }        System.out.print("\n");    }    int max = 0;    for (int n : lastSum) {        if (n > max) {            max = n;        }    }    System.out.println(max);}
0 0
原创粉丝点击