算法——动态规划练习

本文通过动态规划解决数字三角形中的最大和问题,并提供了一种逆向追溯的方法来找出构成最大和的具体路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两篇博文已经稍微详细地讲了动态规划的概念、算法实现以及优化
上网搜几道题来实战
下面这个是从别人那里看到的题目,找到这道题的主要原因是我前几天看了网易的题目,emmm不会做。。。
没错我就是因为受了打击才开始研究算法的QAQ

文章太长了还没看,从点赞量来看应该是篇好文章,先用自己的方法试一试吧,不会再看答案
http://blog.youkuaiyun.com/baidu_28312631/article/details/47418773

问题描述
数字三角形(POJ1163)

7

3   8

8   1   0

2   7   4   4

4   5   2   6   5
在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。 三角形的行数大于1小于等于100,数字为 0 - 99

输入格式:

5      //表示三角形的行数    接下来输入三角形

7

3   8

8   1   0

2   7   4   4

4   5   2   6   5

要求输出最大和

分析:①先用个数组存一下。
②求最优解问题,用动态规划的方法就是不管三七二十一列列看公式啦
先来个sum[i][j]表示当前站在第i行第j列的节点的最大和,要走到这个节点的话,就要考虑它上个节点的最大和咯
这里写图片描述
由图可以看出,有些节点有两个父亲有些有一个,也就是说当前节点要考虑上两个节点的情况(大部分两个嘛)
sum[i][j]=max{sum[i-1][j]+value[i][j]+value[i][j]}
我们画一下这个表(我把二维数组不需要用到的部分去掉,从结构上看还是用树比较开心)
这里写图片描述
得到最终结果是30
怎么找到路径呢?
从30往上找,它的父亲是20或25,在题干给出的二维数组中可以看出,30这个位置的节点原本数值是5,说明30是通过5加上5的父亲得到的,5的父亲=30-5=25,get到一条路,通过这种方法,找到路径如下:
这里写图片描述
看一下原博文的答案,是30。解答方法不一样,大概看了下,他是从下往上遍历的,万变不离其宗,不过博主的优化写得很棒,建议大家读一读,
就酱。
再推荐一篇文章
http://blog.youkuaiyun.com/yuxin6866/article/details/52507623
大家可以看下最长公共子序列和最长公共字串的算法,看完之后会爱上动态规划的,至于kmp算法,我明天再战!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值