动态规划【数塔初始篇之一】

【数塔】杭电2084

 

http://acm.hdu.edu.cn/showproblem.php?pid=2084

 

1. 用递归的方法如下:

 

 

  

 

 

经过实验发现,计算的效率很不理想!为什么会这样?我们不妨简单的分析一下:

 

假如我们计算一个数 MaxSum(i,j) ,就要调用函数,计算 MaxSum(i+1,j) MaxSum(i+1,j+1) ,比较二者的大小,取大者加上 num[i][j] 返回。只要稍微观察,我们就会发现,在计算 MaxSum (i,j+1) 的时候,又再一次调用 MaxSum(i+1,j+1) ,重复计算就是这样产生的。

这样的例子你可能感觉不出什么,我们不妨将每调用一次 MaxSum(i,j) 称作在( i,j )位置上的一次计算,这样我们能得到一个调用次数的数塔:

 

 

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

……

怎么样?是不是很熟?没错,就是传说中的杨辉三角!

计算一下总和: 20 +21 +22 + …… +2N-1

这是多大的一个数……我想就不用我说了吧……

 

难道这道题不能用递归计算么?那倒也不是,只需我们将中间算过的数值保存即可……

 

 

 

  

 书上说:这种将一个问题分解成子问题递归求解,并且将中间结果保存避免重复计算的办法,就叫做“动态规划”。动态规划通常是用来求最优解的问题,能用动态规划求解的最优解问题,必须满足最优解每个局部解也都是最优的。以上题为例,最佳路径上面的每个数字到达底部都是最佳路径。

 

 

 

 

综上,我们可以发现动态规划就是一种递归的体现,它一种更加高效的递归方式,高效在于动态规划以空间换效率,保留了中间变量的值,从而减少大量的重复运算!个人觉得,动态规划是一种更加复杂的递归方式!

转自:http://iiacm.net/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值