数字三角形(递归、动态规划)

题目描述:
计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每个数字可以选择往左下或者右下方向,例如下图中的“3”可以选择数字“8”或者“1”,但是不可以选择数字“0”和数字“9”)。
                     7
                  3     9                              ①
               8     1     0                       ②     ③
            2     7     4     4                 ④     ⑤     ⑥
         4     5     2     6     5          ⑦     ⑧     ⑨     ⑩

注意:
        1、不是选择每层中数值最大的那个。
        2、不是在符合要求的路径中,选择数值最大的那个。
        3、上面2个说法是有区别的。
PS:
    初看这个题目,也许会理解成注意事项中的第一点,仔细思考这个错误的理解,
    换个说法,其实是错误的理解成注意事项中的第二点。合理的利用这2个错误,可以实现下面的算法。
   
算法:
       假如这个三角形就只有1个数字,结果:①
       假如这个三角形就只有3个数字,结果:①+max(②,③)
       假如这个三角形就只有6个数字,结果:max(max(①+②+④,①+②+⑤),max(①+③+⑤,①+③+⑥))
代码实现:
#include <iostream>
#include <cstring>
#include <stdio.h>
#define MAX 100+1
#define Route "/home/wahaha/桌面/123"
using namespace std;
int num[MAX][MAX],n;//n代表层数 h代表行数 l代表列数
int way(int h, int l)
{
    return h == n ? num[h][l]:num[h][l]+max(way(h+1,l),way(h+1,l+1));
}
int main(void)
{
    memset(num,0,sizeof(num));
    freopen(Route,"r",stdin);
    while(cin>>n)
    {
        for(int h=1; h<=n; h++)
           for(int l=1; l<=h; l++)
              cin>>num[h][l];
        cout<< way(1,1) <<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值