每日一题13:数字金字塔
题目描述
观察如下数字金字塔。请写一个程序查找从最高点到底部任意点(数字金字塔共有,行)结束的路径,使路径经过数字的和最大,每一步只能走到左下方的点或右下方的点。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
在如上样例中,7→3→8→7→5的路径产生了所有路径中最大的和7+3+8+7+5=30。
输入格式
第1行输入,表示行数。
之后每行为数字金字塔特定行包含的整数(所有数非负且不大于100)。
输出格式
一行,路径产生的最大的和。
分析
方法1
直接搜索。设二维数组存放数字金字塔中的每个整数,存放最终结果即最大的和。问题要求从最高点按照规则走到最低点的路径的最大权值和,路径起终点固定,走法规则明确,可考虑使用搜索解决问题。
定义无返回类型递归函数 ,其中,表示当前已从走到,目前已走路径上的权值和为。
当时,到达递归出口,如果,则把更新为。当时,未到达递归出口,则向下一行两个位置行走,即递归执行和。
方法1实际上把所有路径都走了一边,由于每一条路径由步组成,每一步有左右两种选择,因此路径总数为,时间复杂度为,太大会超时。