DP入门(数字三角形)

在学习动态规划前让我们先看一个题。

如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大。

                                          

 

如果我们直接暴力,会发现从上到下的路径有24条,所以时间复杂度是2n。显然无法通过暴力求解。我们发现一个节点向下只有两条路径,我们可不可以通过我们之前学到的知识,通过分治算法来进行求解呢,按理是可行的,但当我做起来就会发现第三行的1这个节点它既可以通过第二行3节点到达,也可以通过第二行的8节点到达,那么1节点这个位置我们是否进行了重复计算呢。显然对于上述题目15个节点我们所做的操作是不止于15次的。

那么我们有什么更好的方法呢?通过仔细阅读题目可以发现我们的问题是自上到下的一条最短路径,也就是说我们每层只需要走一次,换句话说我们要想到达第5层我们就必须经过第4层,通过到达第4层的最优解就可以得出到达第5层的最优解。

这种多阶段决策过程,每步求解的问题是后面阶段求解问题的子问题,每部决策将依赖于以前步骤的决策结果,就是我们讲的动态规划。

动态规划问题的前提
一是满足最优子结构,最优子结构就是子问题的最优解是整个问题的最优解,所以最优子结构保证了动态规划中原问题的最优解可以由子问题的最优解推导而来。
二是子问题重叠,子问题之间不独立,一个子问题在不同的阶段多次使用,正是因为子问题重叠,使得正常递归、分治多次求解同一个子问题,造成时间浪费,而采用打表记录子问题答案。假设没有这一点性质,相较于其他算法,并没有优势。

通过上面的介绍,一部分动态规划问题的基本思路或多或少与分治非常的相似,都是把一个大规模的问题分割成多个小规模的子问题,同时开辟一个空间,记录子问题的最优结果避免重复计算。(所以通常说dp就是拿空间换时间)
动态规划有一个最重要的部分,就是状态转移方程,在你了解了动态规划这个算法之后,你就可以通过了解一个问题的状态转移方程来理解整个问题解决的过程。
那什么是状态转移方程呢?动态规划是用于解决多阶段决策问题,而上一个阶段与下一个阶段的转换关系就可以写成状态转移方程。
例如在上述数字三角形问题中,

当从顶层沿某条路径走到第i层向第i+1层前进时,我们的选择一定是沿其下两条可行路径中最大数字的方向前进,为此,我们可以采用倒推的手法,设dp[i][j]存放从i,j 出发到达最底层的最大值,则dp[i][j]=max{dp[i][j]+dp[i+1][j],dp[i][j]+dp[i+1][j+1]},所以dp[1][1] 即为所求的数字总和的最大值。

dp在算法里算是一个比较大且很难的问题,例如经典的背包问题等都属于动态规划的问题,都需要大量的代码练习才能熟练掌握。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值