Triangle Path - 三角形路径


问题

在高度为的三角形上从最上面移动到最下面,三角形上节点的值为,每次移动只能向下移动左右两个邻节点。从上面移动到下面的代价为所有经过节点的值之和。如图所示:

TrianglePath1.png

给定三角形上的个节点,求从上到下的最小移动代价。

解法

高度为的三角形拥有个节点。设节点下标从开始,则第行的节点为。左边节点为,右边节点为

TrianglePath2.png

从上图可知,第行的节点为;第行的节点为;第行的节点为;等等。

三角形的第行有个节点,因此节点的左下节点(类似于左孩子节点)为,右下节点为。节点的左上节点为,右上节点为。根据节点下标如何计算其属于第几行呢?因为,可以先粗略的估算,然后判断节点是否处于第行中。

可以算出节点的行号,为到达节点的最小移动代价(其中)。有状态转移方程:

初始化,节点1到它自己的代价为

对于节点,其左上节点为,右上节点为。显然只能从左上、右上节点到达,则到达的最小代价是这两者中最小的,因此有

在最后一行中找出最小代价即可。该算法的时间复杂度是


LeetCode

leetcode-120.cpp


源码

TrianglePath.h

TrianglePath.cpp

测试

TrianglePathTest.cpp