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

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

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


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

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

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

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

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

一、题目解读洛谷P4551题要求在一个无向图中,寻找任意两点路径权值异或后的最大值。题目输入为图的边信息(点数n和n-1条边),每条边包含起点、终点及权值。需输出所有路径中权值异或的最大值。问题核心在...

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

一、题目解读洛谷2789题要求计算n条直线在平面上两两相交时产生的不同交点数量。题目强调“不同”交点,需排除重复情况。解题关键在于如何高效枚举所有可能的交点组合,并避免重复计数。二、解题思路参考代码采...

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

力扣931题最小下降路径和解析 动态规划解法 LeetCode解题技巧

一、题目解读力扣931题「Minimum Falling Path Sum」(最小下降路径和)要求在一个n x n的整数矩阵中,计算从顶部到底部的最小路径和。路径只能从每个位置向下或对角线移动(即向下...

发表评论

访客

看不清,换一张

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