当前位置:首页 > 其他 > IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现

5个月前 (05-23)


IOI 1994 洛谷1216:如何用O(1)空间解决数字三角形问题?附代码实现 倒推法 洛谷  数字三角形 动态规划 算法 C++ 递推 第1张题目重解:

数字三角形是一个经典的动态规划问题,给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们需要找到一条路径,使得路径上经过的数字总和最大。这个问题可以很好地展示动态规划的空间优化技巧。


解题思路:

1.直接在原数组上进行操作,不需要额外空间

2.从倒数第二行开始向上处理

3.每个位置更新为当前值加上下方两个相邻位置中的较大值

4.最终顶部元素即为最大路径和

这种方法将空间复杂度优化到O(1),直接在输入数组上进行修改,是最优的空间解决方案。


代码详解:

#include<iostream>
using namespace std;
int** nums; // 定义一个二维指针数组,用于存储数字三角形

int main()
{
    int r; // 三角形的行数
    cin>>r; // 输入行数
    nums=new int*[r]; // 为每一行分配指针空间
    for(int i=0;i<r;i++){
        nums[i]=new int[r]; // 为每一行分配具体的存储空间
        for(int j=0;j<=i;j++) // 逐行输入数字
            cin>>nums[i][j];
    }
    for(int i=r-1;i>0;i--){ // 从倒数第二行开始向上计算
        for(int j=0;j<r;j++){ // 遍历当前行的每个位置
            nums[i-1][j]+=max(nums[i][j],nums[i][j+1]); // 更新当前位置的最大路径和
        }
    }    
    cout<<nums[0][0]; // 输出顶部的最大路径和,即为最终答案

    return 0;
}


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

力扣53题:贪心策略与动态规划的完美联姻 三行代码映射算法精髓

题目理解在数字的海洋中寻找最具价值的珍珠链:当我们面对一个可能包含正负数的数组时,寻找连续子数组的和最大值就像在波动的股票曲线中捕捉最佳投资时段。问题的核心在于如何处理可能降低总和的负值元素——是忍痛...

力扣933题:队列的妙用:如何高效统计最近请求

力扣933题:队列的妙用:如何高效统计最近请求

题目重解:我们需要设计一个能统计最近3000毫秒内请求次数的系统。每当新的请求到来时,它会带有时间戳t,我们需要返回过去3000毫秒内(包括当前)发生的请求总数。这就像是在时间轴上维护一个滑动窗口,只...

力扣145:递归之美 轻松掌握二叉树后序遍历

力扣145:递归之美 轻松掌握二叉树后序遍历

题目解读二叉树的后序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。这种遍历方式特别适合需要先处理子节点再处理父节点的场景,如内存释放...

手搓顺序表类代码注释与详解:从零实现动态数组(新手教程)

一、简介和特点顺序表(Sequential List)是数据结构中基础的一种线性表,其特点是将数据元素存储在连续的内存空间中。通过数组实现,支持随机访问(即通过索引直接访问元素),适用于频繁随机读取的...

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

一、题目解读题目要求在一个n×m的网格中,从左上角到右下角选择一条路径,路径上的数字可重复取用,求取数之和的最大值。路径限制为仅能向右或向下移动。需注意路径的灵活性与重复取数的可能性,传统单向动态规划...

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。