高度为n的三角形拥有2(n+1)×n个节点。设节点下标从1开始,则第n行的节点为[2n×(n−1)+1,…,2(n+1)×n]。左边节点为2n×(n−1)+1,右边节点为2(n+1)×n。
从上图可知,第1行的节点为[1,1];第2行的节点为[2,3];第3行的节点为[4,6];等等。
三角形的第n行有n个节点,因此节点i的左下节点(类似于左孩子节点)为i+n,右下节点为i+n+1。节点i的左上节点为i−n−2,右上节点为i−n−1。根据节点下标i如何计算其属于第几行呢?因为2n×(n−1)+1≤i≤2(n+1)×n,可以先粗略的估算n=⌊2×i⌋,然后判断节点i是否处于第n行中。
设n=height(i)可以算出节点i的行号,f(i)为到达节点i的最小移动代价(其中i∈[1,2(n+1)×n])。有状态转移方程:
(2) 对于节点i∈[2,k],其左上节点为lu=i−height(i)−2,右上节点为ru=i−height(i)−1。显然只能从左上、右上节点到达i,则到达i的最小代价是这两者中最小的,因此有min(f(i−height(i)−2),f(i−height(i)−1))+vi;