经典算法题:数字三角形寻找最大路径

题目:数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,该路径上的数字和最大,输出这个最大值。

(1)样例输入:
第一行是数塔层数N(1<=N<=100)。
第二行起,从一个数字按数塔图形依次递增,共有N层。
5
13
11 8
12 7 26
 6 14 15 8
12 7 13 24 11


思路:递归解决

用二维数组 d[ l ][ r ] 存数字三角形

 if ( l  ==  n) maxSum( l , r ) = d [ l ][ r ] ;

 else maxSum ( l , r ) = max { maxSum( l+1, r ) , maxSum( l+1, r+1 ) }

很简单呀


代码如下:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3.   
  4. using namespace std;  
  5.   
  6. #define MAX 101  
  7.   
  8. int d[MAX][MAX];  
  9. int n;  
  10.   
  11. int MaxSum(int l,int r)  
  12. {  
  13.   
  14.     if(l==n)  
  15.         return d[l][r];  
  16.     else  
  17.         return max(MaxSum(l+1,r),MaxSum(l+1,r+1))+d[l][r];  
  18.   
  19. }  
  20.   
  21. int main()  
  22. {  
  23.   
  24.     cin >> n;  
  25.   
  26.     for(int i=1;i<=n;i++)  
  27.         for(int j=1;j<=i;j++)  
  28.             cin >> d[i][j];  
  29.     cout << MaxSum(1,1) << endl;  
  30.   
  31.     return 0;  
  32.   
  33. }  

好了,数据量大一点的时候,就华丽丽的超时了

分析一下时间复杂度,发现是 O(2^n),原因是

会 重 复 计 算 maxSum (r,l) 的值!

————————————————————————————————————————————————————————————————————————————


优化:(记忆递归型动态规划)

思路:那就把计算结果存下来嘛。


代码如下:

[cpp]  view plain  copy
  1. #include <iostream>  
  2. #include <algorithm>  
  3.   
  4. using namespace std;  
  5.   
  6. #define MAX 101  
  7.   
  8. int d[MAX][MAX];  
  9. int n;  
  10. int maxSum[MAX][MAX];  
  11.   
  12. int MaxSum(int i,int j)  
  13. {  
  14.     if(maxSum[i][j]!=-1)  
  15.         return maxSum[i][j];  
  16.     if(i==n)  
  17.         maxSum[i][j] = d[i][j];  
  18.     else  
  19.         maxSum[i][j] = max(MaxSum(i+1,j),MaxSum(i+1,j+1)) + d[i][j];  
  20.   
  21.     return maxSum[i][j];  
  22. }  
  23.   
  24.   
  25. int main()  
  26. {  
  27.   
  28.     cin >> n;  
  29.   
  30.     for(int i=1;i<=n;i++)  
  31.         for(int j=1;j<=i;j++){  
  32.             cin >> d[i][j];  
  33.             maxSum[i][j]=-1;  
  34.         }  
  35.   
  36.     cout << MaxSum(1,1) << endl;  
  37.   
  38.     return 0;  
  39. }  

算法时间复杂度成功变成 O(n^2);

不过递归还是慢一点,继续优化! 



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值