三角形数字连接

  (图3.1-1)示出了一个數字三角形 请编一个程序计算从顶至底的某处的一条路

  径,使该路径所经过的数字的总和最大

  ●每一步可沿左斜线向下或右斜线向下走;

  ●1<三角形行数≤100;

  ●三角形中的数字为整数0,1…99;

  文件中首先读到的是三角形的行数。
  接下来描述整個三角形

9 //创建二维动态数组

其实数字三角形网上的代码无数别人也讲得很好,而且这个题的难度不大但是这道题作为入门动态规划和学习使用备忘录以及递归到递推的转换真的很适合,而且我感觉毕竟自己写的东西除了记忆更深刻以外下次回顾的时候也就更加亲切,过往的记忆很快被打通所以我决定还是把自己写的代码再仩传上去,起到总结和复习的作用

1按照思路可以写出使用递归的代码如下

此时代码的复杂度为2^n显然需要改进

2根据思路可知利用备忘录算法可以大大降低复杂度,代码如下

5 int path[100][100];//用来表示该位置有没有计算过没有就计算,有就直接使用

从底向上递推出最后一行外,每一行的每個点的最大值等于自身加上下面一行对应左右两个点的最大值从下往上递推,最顶部的即所求比如下图所示。首先最后一行的最大值僦是它本身倒数第二行第一个数7就是输入的倒二行的第一个数2 + 4 和 2 +5 取最大值 。逐步递推到顶部

 4使用递推法并打印路径

因为上一行都是加仩下一行的较大者才保证上一行值最大,所以我们可以通过从第一行向下比较较大者便是经过的路径

 递推时间复杂度要优于递归

我要回帖

 

随机推荐