问题描述:
- 数字三角形,从顶部出发,在每一结点可以选择向左走或者向右走,一直走到底层。
- 试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
易错点:采用贪心算法就无法找到真正的最大和。
当从顶部向下,或者从底部向上贪心时都是错误的。
算法分析:
- 从数字三角形的特点来看,不难发现解决问题的阶段划分,应该是自下而上逐层决策。不同于贪心策略的是,动态规划算法是逐层递推的。
- 状态转移方程如下:
其中 i =n-2,n-3,…,0(0≤j≤i)。
计算数字三角形问题的动态规划算法
#define NUM 100
int tri[NUM][NUM];
int triangle(int n)
{
int i, j;
for (i=n-2; i>=0; i- -)
for (j=0; j<=i; j++)
if( tri[i+1][j] >tri[i+1][j+1])
tri[i][j] += tri[i+1][j];
else tri[i][j] += tri[i+1][j+1];
return tri[0][0];
}