数塔问题【递推算法】

简介: 关于输入:本题输入一个正整数n,然后输入n行数字,其中第i行有i个数字。例如: 5 73 88 1 02 7 4 44 5 2 6 5 本题输入的三角数组形状如下图1,在处理数据时按图2形状来处理。

关于输入:本题输入一个正整数n,然后输入n行数字,其中第i行有i个数字。例如:

5

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

本题输入的三角数组形状如下图1,在处理数据时按图2形状来处理。在上面的输入案例中,可以按图3所示数塔来处理。

         

   图1                          图2                     图3

问题需求:从数塔顶层到底层的某处所经过的路径可能有很多条。本题要求计算所有路径中,各节点数之和最大的那条路径的节点数之和。(注意:只要求输出节点数总和最大的那条路的节点数之和,不是要寻找那条路径。)

另外:从上往下走时,每一步可以沿着左斜线或右斜线走。

关于数据规模:整个数塔的行数n<=100.数塔中的数字a[i][j] ∈ [0,99].

 

算法分析:

      本题不需要寻找路径,可以简单地递推即可得到解答.

试想,从上往下走时,每一步都面临左和右的选择。为了得到最大总和,在看不见更深层的数据时,都应该按照贪心策略,从左和右两边中选比较大的那一边作为向下一层行走的路线。这是正向思路,比较好理解。但这样一来,路径太多,很难找到解答。我们可以考虑逆向递推。既然每一步都选择较大的那一边,那么我们可以假设a[i][j]表示从i,j出发到达底层的最大值。那么就有递推公式:a[i][j]=max{   a[i][j]+a[i+1][j]  ,   a[i][j]+a[i+1][j+1]  }.如此一来,a[1][1]就是我们要找的值。

代码如下:

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int n,a[201][201];
 5     int i,j;
 6     
 7     scanf("%d",&n);//输入n
 8     for(i=1;i<=n;i++)//输入数塔
 9     {
10         for(j=1;j<=i;j++)
11         {
12             scanf("%d",&a[i][j]);
13         }
14     }
15     
16     for(i=n-1;i>0;i--)//从倒数第2层开始逆推每一层每一个元素到底层的最大值
17     {
18         for(j=1;j<=i;j++)
19         {
20             if(a[i+1][j]>a[i+1][j+1]) a[i][j]+=a[i+1][j];
21             else a[i][j]+=a[i+1][j+1];
22         }
23     }
24     printf("%d\n",a[1][1]);//输出从顶层到底层的最大值
25     return 0;
26 }

 

 

相关文章
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
61 0
|
机器学习/深度学习 人工智能 移动开发
递推算法-五种典型的递推关系
递推算法-五种典型的递推关系
278 0
|
算法
秒懂算法 | 递推方程求解方法
时间复杂度和空间复杂度表示为递推方程的两种求解方法。
296 1
秒懂算法 | 递推方程求解方法
|
算法 C语言
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
|
算法 测试技术
动态规划真的有那么抽象吗?(递推算法还是动态规划别傻傻分不清了) 以正确的姿势学习动态规划 (入门篇)
动态规划真的有那么抽象吗?(递推算法还是动态规划别傻傻分不清了) 以正确的姿势学习动态规划 (入门篇)
动态规划真的有那么抽象吗?(递推算法还是动态规划别傻傻分不清了) 以正确的姿势学习动态规划 (入门篇)
|
机器学习/深度学习 算法
斐波拉契数列的递推递归求解算法
斐波拉契数列的递推递归求解算法
100 0
|
机器学习/深度学习 算法 C++
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
(C/C++)STL函数(3)二分算法题以及二分模板 和(蓝桥杯)递推与递归题目及解法(ACwing)
|
算法
杭电oj HDOJ 2050 折线分割平面(递推)算法 数学逻辑(由分割平面转化而来)
杭电oj HDOJ 2050 折线分割平面(递推)算法 数学逻辑(由分割平面转化而来)
121 0
杭电oj HDOJ 2050 折线分割平面(递推)算法 数学逻辑(由分割平面转化而来)
|
人工智能 算法
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。