C:(100分)
我理解的大概原理:
题目:“从最高点到底部任意处结束的路径,使路径经过数字的和最大”
也就是找下面其中的一条路线,然后把这条路线上的所有数加起来,找到和数最大的那条路线
然后当时我的第一想法是列出所有的路线,然后得出每条路线的和,比如:
7(塔顶)- 3 - 8 - 2 - 4 和为 24
7(塔顶)- 3 - 8 - 2 - 5 和为 25
............................
之后了解到了下面要说的算法,感觉简单了很多很多
这个算法的基本原理有两点:
1. 逆向思维,从塔顶开始弄
2. 比较 一个数A 与相连的两个数中哪个数最大,把这个最大的数加到A上
(我们可以从这金字塔看出,除去塔顶和塔底的数外,每个数对上面有一个数相连,对下面有两个数相连
以该图左下部分为例:
除去塔底的4 和 5
以2为例
2对上面只有一个数相连,为8
2对下面有两个数相连,为4 和 5
做一个判断,在4 和 5中选择最大的那个加到2上面,2变成7
右边也与左边一样
待塔底的所有数都比较完也选择相应最大的加到 塔底第二行上,第二行也重复上述步骤
最终汇聚到塔顶
最后只需要输出塔顶的数,就可以得到 “单独的一行,得到的最大的和”
(大概是这个样,可能说的不是很清楚,建议自己上机看监视过一遍)
)
#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#define biao_Max 1001int biao[biao_Max][biao_Max] = { 0 }; //创建一个二维数组来储存 数字金字塔int whoismax(int x, int y)
{return x > y ? x : y;
}int main()
{int r = 0; //正整数 r ,表示行的数目scanf("%d", &r);//把数字金字塔导入二维数组内for (int i = 0; i < r; i++){for (int j = 0; j <= i; j++){scanf("%d", &biao[i][j]);}}//算法主体for (int i = r - 2; i >= 0; i--){for (int j = 0; j <= i; j++){biao[i][j] += whoismax(biao[i + 1][j], biao[i + 1][j + 1]);}}printf("%d", biao[0][0]);return 0;
}
C++:(100分)
C++的话就是把自制的max函数换成了头文件自带的,然后修改了输入和输出,没什么大变化
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <algorithm>using namespace std;#define biao_Max 1001int biao[biao_Max][biao_Max] = { 0 }; //创建一个二维数组来储存 数字金字塔int main()
{int r = 0; //正整数 r ,表示行的数目cin >> r;//把数字金字塔导入二维数组内for (int i = 0; i < r; i++){for (int j = 0; j <= i; j++){cin >> biao[i][j];}}//算法主体for (int i = r - 2; i >= 0; i--){for (int j = 0; j <= i; j++){biao[i][j] += max(biao[i + 1][j], biao[i + 1][j + 1]);}}cout << biao[0][0];return 0;
}
python:(100分)
python版的C语言,python中没有二维数组,就改用列表了
r = eval(input())list1 = []for i in range(r):list1.append(list(map(int, input().split(" "))))for i in reversed(range(r - 1)):for j in range(i + 1):list1[i][j] += max(list1[i + 1][j], list1[i + 1][j + 1])print(list1[0][0])