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
#define biao_Max 1001
int 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
#include
using namespace std;
#define biao_Max 1001
int 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])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)