【蓝桥杯】 C++ 数字三角形 动态规划 ⭐⭐

news/2025/2/9 0:42:03/

文章目录

    • 题目描述
      • 输入描述
      • 输出描述
    • 实现代码
    • 解题思路
    • 注意点
    • 知识点

题目描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。
在这里插入图片描述

输入描述

输入的第一行包含一个整数 N (1≤N≤100),表示三角形的行数。下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 99 之间的整数。

输出描述

输出一个整数,表示答案。

实现代码

#include<bits/stdc++.h>
using namespace std;#define N 101int main()
{int n;cin>>n;int tri[N][N]={0};  // 存输入的三角形int dp[N][N]={0};   // 存动态规划算出来的数,到达每一个点最大的和for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>tri[i][j];}}// 要算 dp[i][j] ,就得知道 tri[i][j]和 dp[i-1][j] 和 dp[i-1][j-1] 中哪个最大for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+tri[i][j];}}int ans=dp[n][1];for(int i=1;i<=n;i++){if(dp[n][i]>ans){ans=dp[n][i];}}cout<<ans;return 0;
}

解题思路

这个题是动态规划的题目,首先根据题意发现这个和递归很像,通过子问题堆叠可以推出要求解的问题,同时动态规划通常用于最优解问题,解决这个问题比较方便。

  1. 把数字三角形存入二维数组,待后续取用。
  2. 把三角形变成直角三角形,如下图,可以发现要求第三行的 “1” 的最大ans,就需要知道第二行 “3” 和 “8” 的最大 ans,取较大的 ans,因此可得到达每一个点的 dp[ i ] [ j ] = dp[ i-1 ] [ j-1 ] + dp[ i-1 ] [ j ] + tri[ i ] [ j ],
  3. 最后比较最后一行的每个数的ans,取最大即可得到答案。
    在这里插入图片描述

注意点

  • 注意 tridp 要开101个,不知道为什么,如果开 n+1 个的话,结果就不对……
  • 注意 dp[ i ][ j ] 的算法,加完上面最大的ans之后,还需要加 tri[ i ] [ j ] 的值。

知识点

  • 动态规划文章:看一遍就理解:动态规划详解 、 动态规划和递归的区别 。根据下面的代码可以更加直观地理解动态规划和递归的区别与相似之处。
    在这里插入图片描述

http://www.ppmy.cn/news/34452.html

相关文章

Vue3 pinia入门篇(一)

系列文章目录 主要为了记录如何使用Pinia在Vue3中的使用方式&#xff08;下面会介绍为什么使用Vue3选型&#xff09; 文章目录系列文章目录不用Vue2使用Pinia举例子&#xff1f;1.笔者的个人看法&#xff1a;2.总结一、Pinia是什么1.状态管理工具&#xff08;类比Vuex&#xff…

电容在微分、积分电路中的本质以及应用

很多朋友觉得PID是遥不可及&#xff0c;很神秘&#xff0c;很高大上的一种控制&#xff0c;对其控制原理也很模糊&#xff0c;只知晓概念性的层面&#xff0c;知其然不知其所以然&#xff0c;那么本期从另类视角来探究微分、积分电路的本质&#xff0c;意在帮助理解PID的控制原…

算法基础-回溯算法

回溯算法大致分为以下几类&#xff1a; 组合&#xff1a;组合、组合总和、电话号码的字母组合 分割&#xff1a;分割回文串、复原IP地址 子集&#xff1a;子集 排列&#xff1a;全排列 棋盘问题&#xff1a;N皇后、解数独 其他&#xff1a;递增子序列、重新安排行程 一、什么是…

C语言通讯录应用程序:从设计到实现

hello&#xff0c;这期给大家带来C语言实现静态通讯录,主要也是建立起创建大项目的思维&#xff0c;与往期这两篇博客有点类似 C语言实现三子棋 C语言实现扫雷 文章目录&#x1f913;通讯录介绍&#x1f636;‍&#x1f32b;️效果演示&#x1f920;主题框架头文件测试文件函数…

把python开发的web服务,打包成docker镜像的方法

要将Python开发的服务打成Docker镜像&#xff0c;可以按照以下步骤操作&#xff1a;1. 创建一个Dockerfile文件&#xff0c;该文件描述了如何构建Docker镜像。例如&#xff0c;以下是一个简单的Dockerfile文件&#xff0c;用于构建一个基于Python的Web应用程序&#xff1a; FRO…

【STL三】序列容器——array容器

【STL三】序列容器——array一、array简介二、头文件三、模板类四、成员函数1、迭代器2、元素访问3、容量4、操作五、demo1、容量&#xff08;不使用迭代器&#xff09;2、使用迭代器3、元素访问 at()、front()、back()、data()一、array简介 array 容器是 C 11 标准中新增的序…

DPDK官方文档翻译:Linux Drivers

参考&#xff1a;http://doc.dpdk.org/guides/linux_gsg/linux_drivers.html#linux-gsg-binding-kernel 不同的 PMD 可能需要不同的内核驱动程序才能正常工作。根据所使用的 PMD&#xff0c;应加载相应的内核驱动程序&#xff0c;并且网络端口应绑定到该驱动程序。 1、绑定和取…

SpringBoot整合Flink(施耐德PLC物联网信息采集)

SpringBoot整合Flink&#xff08;施耐德PLC物联网信息采集&#xff09;Linux环境安装kafka前情&#xff1a;施耐德PLC设备&#xff08;TM200C16R&#xff09;设置好信息采集程序&#xff0c;连接局域网&#xff0c;SpringBoot订阅MQTT主题&#xff0c;消息转至kafka&#xff0c…