为了账号安全,请及时绑定邮箱和手机立即绑定

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

https://img1.sycdn.imooc.com/f3db3e680836b7f118200693.jpg

题目重解

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

解题思路

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;}

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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消