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


题目描述:
计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每个数字可以选择往左下或者右下方向,例如下图中的“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;
}

相关内容