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

博客探讨了如何解决数字金字塔问题,找到从顶部到底部的最大路径和。介绍了三种方法:直接搜索(时间复杂度O(2^n))、记忆化搜索(时间复杂度O(n))和动态规划(时间复杂度O(n)),并详细解释了它们的工作原理和实现。
摘要由CSDN通过智能技术生成

每日一题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

引用和引用[2]都提供了数字金字塔C++代码示例,它们的实现方式略有不同。引用使用了二维数组来存储数字金字塔,通过两层循环来计算每个数字的最大路径和。而引用则使用了vector嵌套vector的方式来存储数字金字塔,同样通过两层循环来计算最大路径和。以下是两个示例代码: 引用[1]示例代码: ```cpp #include <iostream> using namespace std; int main() { int numRows; cout << "请输入数字金字塔的行数:"; cin >> numRows; int pyramid[numRows][numRows]; cout << "请输入数字金字塔的每个数字(按行输入):" << endl; for (int i = 0; i < numRows; i++) { for (int j = 0; j <= i; j++) { cin >> pyramid[i][j]; } } for (int i = numRows - 2; i >= 0; i--) { for (int j = 0; j <= i; j++) { pyramid[i][j] += max(pyramid[i+1][j], pyramid[i+1][j+1]); } } cout << "数字金字塔的最大路径和为:" << pyramid[0][0] << endl; return 0; } ``` 引用示例代码: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int t; cin >> t; for (int i = 0; i < t; i++) { int r; cin >> r; vector<vector<int>> matrix(r); for (int j = 0; j < r; j++) { for (int k = 0; k < j + 1; k++) { int temp; cin >> temp; matrix[j].push_back(temp); } } for (int j = r - 1; j > 0; j--) { for (int k = 0; k < j; k++) { matrix[j][k] > matrix[j][k + 1] ? matrix[j - 1][k] += matrix[j][k] : matrix[j - 1][k] += matrix[j][k + 1]; } } cout << matrix[0][0] << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值