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

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

11个月前 (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;
}


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

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

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

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

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

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

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

力扣第44题:寻找两个正序数组的中位数 - 合并排序解法详解

内容简介本文详细解析了力扣第44题"寻找两个正序数组的中位数"的合并排序解法。通过双指针技术合并两个有序数组,然后直接计算合并后数组的中位数。虽然时间复杂度为O(m+n),但这种方...

发表评论

访客

看不清,换一张

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