以数字三角形为例。
求出一个数字三角形从上到下一条路径的结点总值最大
1.递归计算
int solve(int I,int j){
return a[I][j]+(I==n?0:max(solve(I+1,j),solve(I+1,j+1)));
}
这种方法对于这题来说效率有点低了,因为重复计算了已经计算过的结点。从上到下。
2.递推计算
这个是从下到上
int I,j;
for( j=1;j<=n;j++)d[n][j]=a[n][j];
for( I=n-1;i>=1;i--)
for( j=1;j<=I;j++)
d[I][j]=a[I][j]+max(d[I+1][j],d[I+1][j+1]);
3.记忆化搜索
这个就是从上到下的改进版,重复计算过的结点存储起来,可以直接用
memset(d,-1,sizeof(d));
int solve(int I,int j){
if(d[I][j]>0)return d[I][j];
d[I][j]=a[I][j]+(I==n?0:max(solve(I+1,j),solve(I+1,j+1)));
}