问题:计算一个路线上的数字的最高总和,从顶部开始,结束在底部的某处。每一步都可以沿着对角线向左或向右向下。
1.正向思路:(穷举:)从上往下,计算到底,当计算到第N层时候,复杂度已经是O(2^(n-1))。一个节点获得的当前计算值是指数增加的,例如第三层的第二个节点a[2][1]拥有2种路线计算的值:a[0][0]+a[1][0]+a[2][1]以及a[0][0]+a[1][1]+a[2][1]。而后这拥有2种值的节点传递到下一层会被另外2个节点接受,对于下一层的节点,每一个都要接受2个上层节点的值,合计4种不同的值,运算后传递4种不同的结果给下层节点,下层节点又因为同时接受2个上层节点则翻倍为8种不同值。如此往复,运算量将会亿兆倍增加。
解决方案:
归纳合并:由于当前节点接受了2个上层节点的结果值,将会产生多种不同的累加结果。我们假设此节点就是最大值计算路线上的一个点。后半段的最大值暂且不管,前半段的最大值显然是max(上层节点值+本层节点值)。我们取得当前节点前半段的最大值,然后传递给下一层节点。(前半段最大值路线+后半段最大值路线=最大值路线)如此一来,每一个下层节点最多只接收上层2个节点的合计2种不同值,然后重复进行max计算,那么每一层到下一层的传递都是1:1传递。原本的复杂度2^n 变成1。只是多出了额外的max的复杂度,max复杂度为(O((n-1)(n-2)/2)) 约等于O(n^2)。综合起来复杂度由O(2^n)变成O(n^2)
2.逆向思路:逆向思路类似正向思路,只是将公式由(前半段最大值路线+后半段最大值路线=最大值路线)变成(后半段最大值路线+前半段最大值路线=最大值路线)。对于上层节点,获取该节点的下层节点值,计算出2种值后取其大,如果该层节点是最大值路线中的一点,那么只有大值路线才有意义,如果不是最大值路线中的一点,那么无论大小都没有意义。