当前位置:首页 > 其他 > IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

9个月前 (05-23)

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析 洛谷 动态规划 指针数组 算法 C++ 第1张

题目重解

给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、资源分配等。

解题思路

1.首先读取数字三角形并存储在二维数组

2.初始化dp数组,dp[i][j]表示到达第i行第j列时的最大和

3.对于每个位置,考虑从左上或右上转移过来的可能:

        1.第一列只能从正上方转移

        2.最后一列只能从左上方转移

        3.中间位置取上方两个位置中的较大值

        4.最后遍历最后一行找出最大值

代码详解

#include<iostream>
using namespace std;

int main()
{
    int r;  // 三角形行数
    cin>>r;
    // 申请存储三角形数字和dp数组的空间
    int** num=new int*[r];
    int** dp=new int*[r];
    for(int i=0;i<r;i++){
        dp[i]=new int[r];
        num[i]=new int[r];
        // 读取每行数字
        for(int j=0;j<=i;j++)
            cin>>num[i][j];
    }
    
    // 初始化起点
    dp[0][0]=num[0][0];
    // 动态规划过程
    for(int i=1;i<r;i++){
        for(int j=0;j<=i;j++){
            if(!j) dp[i][j]=dp[i-1][j]+num[i][j];  // 最左列
            else if(j==i) dp[i][j]=dp[i-1][j-1]+num[i][j];  // 最右列
            else dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+num[i][j];  // 中间位置
        }
    }
    // 找出最后一行最大值
    int ret=0;
    for(int i=0;i<r;i++)
        ret=max(ret,dp[r-1][i]);
    cout<<ret;
    
    // 释放内存
    for(int i=0;i<r;i++){
        delete[] dp[i];
        delete[] num[i];
    }
    delete[] dp;
    delete[] num;
    return 0;
}


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

力扣第1991题:寻找数组的中心索引 如何找到左右和相等的中心索引

题目解读给定一个整数数组,我们需要找到一个中心索引,使得该索引左侧所有元素的和等于右侧所有元素的和。如果不存在这样的索引,则返回-1。中心索引的定义不包含在左右两侧的和计算中。这个问题考察对数组遍历和...

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

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

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

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

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

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

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

发表评论

访客

看不清,换一张

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