动态规划三种方法

以数字三角形为例。

求出一个数字三角形从上到下一条路径的结点总值最大

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)));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值