1 数塔问题
1.1 思路
把每一个点看成一个状态,即从每个状态开始到达终点的最大值称为它的状态值,由此可见,每一个点的最大值,与它所连的两个点的状态值的大小密切相关。对此,我们引出一个方程。
状态转移方程:d(i, j) = a(i, j) + max{d(i + 1, j), d(i + 1, j + 1)}
1.2 解决方法
方法一:递归计算
int solve(int i, int j){
return a[i][j] + (i == n ? 0 : max(solve(i + 1, j),solve(i + 1, j + 1)));
}
大家可以看到,这样做有些点会计算到两次,所以它的效率还不是最高的。
方法二:递推计算
int i, j;
for(j = 1; j <= n; j++) d[n][j] = a[n][j];
for(i = n - 1; i >= i; j++)
for(j = 1; j <= i; j++)
d[i][j] = a[i][j] + max(d[i + 1][j], d[i + 1][j + 1]);