数字金字塔问题C++

文章介绍了如何使用递归和迭代两种方法在数字金字塔结构中求解从顶部到底部的最大路径和,展示了C++代码实现,并指出两者在本质上没有太大的区别,主要在于编程风格的不同。
摘要由CSDN通过智能技术生成

数字金字塔,要求计算从最高点到底部任意处结束路径的最大和。

采用从下向上加的思考方法

输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最大路径和为 21(即,2 + 4 + 7 + 8 = 21)。

递归法

#include <iostream>
using namespace std;
int n;
const int maxn=1005;
int a[maxn][maxn];
int dfs(int i,int j){
    
     int count=0;
    if(i==n-1)
    {return a[n-1][j];
    }
    count=count+max(dfs(i+1,j),dfs(i+1,j+1));
    return count;
}

int main(){
    
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            
            cin>>a[i][j];
        }
        
    }
    int ans;
    ans=dfs(0,0)+a[0][0];
    cout<<ans;
    return 0;
    
}
要理解,假设某条最大路径经过某一点,则他肯定是由这点的值加上下一层两条路径中最大的那条路径,最后别忘了加上顶点,递归结束是底层点的值。

 

迭代法:

#include <bits/stdc++.h>
using namespace std;
const int maxn=1005;
int a[maxn][maxn];
int main()
{int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=i;j++)
        {
            
            cin>>a[i][j];
        }
        
    }
    
    for(int i=n-2;i>=0;i--)
    {
        for(int j=0;j<=i;j++)
        
        {    
            a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
        }
    }
    cout<<a[0][0];
    return 0;
}

我的评价是一样的没大区别写法不一样罢了。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值