您的位置:首页 > 其它

算法——动态规划练习

2018-03-18 23:22 274 查看
前两篇博文已经稍微详细地讲了动态规划的概念、算法实现以及优化

上网搜几道题来实战

下面这个是从别人那里看到的题目,找到这道题的主要原因是我前几天看了网易的题目,emmm不会做。。。

没错我就是因为受了打击才开始研究算法的QAQ

文章太长了还没看,从点赞量来看应该是篇好文章,先用自己的方法试一试吧,不会再看答案

http://blog.csdn.net/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.csdn.net/yuxin6866/article/details/52507623

大家可以看下最长公共子序列和最长公共字串的算法,看完之后会爱上动态规划的,至于kmp算法,我明天再战!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息