C++ 每日一题13:数字金字塔

每日一题13:数字金字塔

题目描述

观察如下数字金字塔。请写一个程序查找从最高点到底部任意点(数字金字塔共有R(1\leq R \leq 1000R\in \mathbb{Z})行)结束的路径,使路径经过数字的和最大,每一步只能走到左下方的点或右下方的点。

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行输入R,表示行数。

之后每行为数字金字塔特定行包含的整数(所有数非负且不大于100)。

输出格式

一行,路径产生的最大的和。

分析

方法1

直接搜索。设二维数组a存放数字金字塔中的每个整数,ans存放最终结果即最大的和。问题要求从最高点按照规则走到最低点的路径的最大权值和,路径起终点固定,走法规则明确,可考虑使用搜索解决问题。

定义无返回类型递归函数dfs(int x,int y,int cur),其中xy表示当前已从(1,1)走到(x,y),目前已走路径上的权值和为cur

x==n时,到达递归出口,如果cur>ans,则把ans更新为cur。当x<n时,未到达递归出口,则向下一行两个位置行走,即递归执行dfs(x+1,y,cur+a[x+1][y])dfs(x+1,y+1,cur+a[x+1][y+1])

方法1实际上把所有路径都走了一边,由于每一条路径由n-1步组成,每一步有左右两种选择,因此路径总数为2^{n-1},时间复杂度为O(2^{n-1})n太大会超时。

方法2

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值