【鸽子木·每日一题】数字三角形(3月22日)

文章描述了一个使用动态规划方法解决从下往上计算数组中每个元素最大值的问题。初始用深度优先搜索(DFS)尝试但未能成功,最终采用了从下往上的策略,从倒数第二层开始判断相邻两数的最大值,并更新到上一层。程序以C++实现,输出结果为数组左上角的元素,即整个数组的最大值。
摘要由CSDN通过智能技术生成

动态规划

本来用了dfs,然后写不出来,方向错了。

本题思路:

从上往下的情况比较复杂,情况比较多,所以从下向上思考会比较简单。

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

7
3 8
8 1 0 
7 12 10 10

7
3 8
20 13 10 

7
23 21

30

只需要从倒数第二层开始判断,判断下一层两个数字的较大值,一直往上判断,这样一定会遍历每一个数字和情况,而且答案就是arr[0][0]

#include <iostream>
using namespace std;
int n;
int arr[501][501];
int main()
{
    scanf("%d",&n); 
    int num = 1;//判断当前所在层数 
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = 0 ; j < num ; j++)
        {    
            scanf("%d",&arr[i][j]);//读入
        }
        num++;//所在层数++ 
    }
    
    for(int i = n-2 ; i >= 0 ; i--)
    //定义的n实际上为数组的arr[n-1][]层
    //又因为最后一层不需要判断更下一层,所以开始判断的层数初始值为n-2 
    {
        for(int j = num-1 ; j >= 0 ; j--)
        {    
            arr[i][j] += max(arr[i+1][j],arr[i+1][j+1]);
        }
        num--;
    }
    printf("%d",arr[0][0]);
    
//输出测试 
//num = 1;
//cout << endl;
//    for(int i = 0 ; i < n ; i++)
//    {
//        for(int j = 0 ; j < num ; j++)
//        {    
//            cout << arr[i][j] << " ";
//        }
//cout << endl;
//        num++;
//    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值