C++/python描述 898. 数字三角形 (四种实现方法)

  大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客 ,同时正在尝试在B站中做一些内容分享,B站主页为: 亓官劼的B站主页

本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
若需联系博主,可以联系本人微信:qiguanjie2015


题目

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

        73   88   1   02   7   4   4
4   5   2   6   5

输入格式

第一行包含整数n,表示数字三角形的层数。

接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。

输出格式

输出一个整数,表示最大的路径数字和。

数据范围

1≤n≤500,
−10000≤三角形中的整数≤10000

输入样例:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出样例:

30

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。

        73   88   1   02   7   4   4
4   5   2   6   5

输入格式

第一行包含整数n,表示数字三角形的层数。

接下来n行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。

输出格式

输出一个整数,表示最大的路径数字和。

数据范围

1≤n≤500,
−10000≤三角形中的整数≤10000

输入样例:

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出样例:

30

题解思路

这题可以使用动态规划的思想,第一行是起点,不需要动,从第二行开始,路径和最大值a[i][j]分为三种情况:

  • 第i行第1个数只能由第i-1行第1个数向左下走到
  • 第i行第i个数只能由第i-1行第i-1个数向右下走到
  • 第i行第2n-1个数,可以由第i-1行第2n-2个数走到,每次取其中最大值,状态转移方程为:a[i][j] += max(a[i-1][j-1],a[i-1][j])

C++实现为:

#include<iostream>
using namespace std;
int main(){int n;cin>>n;int a[505][505];for(int i = 1; i <= n; i++)for(int j = 1; j <= i; j++)scanf("%d",&a[i][j]);for(int i = 2; i <= n; i++){// 第i行第1个数只能由第i-1行第1个数向左下走到a[i][1] += a[i-1][1];// 第i行第2~n-1个数,可以由第i-1行第2~n-2个数走到// 从第二行开始向下走,最大值a[i][j] += max(a[i-1][j-1],a[i-1][j])for(int j = 2; j <= i-1; j++){a[i][j] += max(a[i-1][j-1],a[i-1][j]);}// 第i行第i个数只能由第i-1行第i-1个数向右下走到a[i][i] += a[i-1][i-1];}int ans = a[n][1];for(int i = 1; i <= n; i++){if(a[n][i] > ans)ans = a[n][i];}cout<<ans;return 0;
}

C++实现二:倒推实现

#include<iostream>
using namespace std;
int main(){int n;cin>>n;// 开辟空间,赋值为0int a[505][505] = {0};for(int i = 1; i <= n; i++)for(int j = 1; j <= i; j++)scanf("%d",&a[i][j]);// 倒序dp,这样写放简单,不需要考虑边界问题// 从第n行向第1行倒推// 状态转移方程:a[i][j] += max(a[i+1][j],a[i+1][j+1])for(int i = n-1; i >= 1; i--){for(int j = 1; j <= i; j++){a[i][j] += max(a[i+1][j],a[i+1][j+1]);}}// 倒推到第一行,则a[1][1]即最大值cout<<a[1][1];return 0;
}

Python实现一:


n = int(input())
# store存储输入数据
store = []
# 输入
for i in range(0,n):# 每次读入一行,int类型temp = list(map(int, input().split()))store.append(temp)
# 注意这里是从0开始存储的,与C++实现时不同
for i in range(1,n):# 第i行第0个数只能由第i-1行第0个数向左下走到store[i][0] += store[i-1][0]# 第i行第1~i-1个数,可以由第i-1行第1~i-1个数走到# 从第二行开始向下走,最大值store[i][j] += max(store[i-1][j-1],store[i-1][j])for j in range(1,i):store[i][j] += max(store[i-1][j-1],store[i-1][j])# 第i行第i+1个数只能由第i-1行第i个数向右下走到store[i][i] += store[i-1][i-1]
# 记录最大值即返回值
ans = store[n-1][0]
for item in store[n-1]:if item > ans:ans = item
print(ans)

Python实现二:倒推实现

# 自下往上做更方便N = int(input())
# 多开一行,方便实现在1-N上存储,看起来更方便
dp = [[0]*(N+1) for _ in range(N+2)]
s = [[0]]
for i in range(N):a = list(map(int, input().split()))s.append(a)
for i in range(N, 0, -1):for j in range(i):dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+s[i][j]
print(dp[1][0])

C++/python描述 898. 数字三角形 (四种实现方法)相关推荐

  1. Python实现缺失数字的四种方法

    给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数 Example 1: Input: [3,0,1] Output: 2 Example ...

  2. python的布尔判断和四种循环语句

    python的布尔判断和四种循环语句 一.布尔运算的三种方式 (一)两个数值/字符串做比较 (二)直接用数值做运算 (三)布尔值之间的运算 (四)布尔值与While.if 二.四种循环语句 (一)br ...

  3. python中如何创建一个空列表_Python学习笔记(1):列表的四种创建方法

    我的电脑安装的是Anaconda 3开源的Python发行版本,其中是集合3.6版本的Python与可视化编程工具采用的是Spyder. 打开Spyder可视化工具,新建一个空白文件,做好备注为&qu ...

  4. 图像处理/计算机视觉/python环境下/如何用四种不同滤波器处理噪声【附代码、亲测有效】

    计算机视觉实操之图像处理 一.问题描述 二.效果图 三.代码附录 四.相关链接 一.问题描述 向图片中分别加入椒盐噪声.高斯噪声,使用四种不同的滤波器观察图片的处理效果(算术均值滤波.几何均值滤波 . ...

  5. 如何打开python的交互窗口-Python多版本情况下四种快速进入交互式命令行的操作技巧...

    原标题:Python多版本情况下四种快速进入交互式命令行的操作技巧 因为工作需求或者学习需要等原因,部分小伙伴的电脑中同时安装了Python2和Python3,相信在Python多版本的切换中常常会遇 ...

  6. python安装第三方库-python第三方库的四种安装方法

    讲解一下python第三方库的四种安装方法 问题场景 (我的操作系统windows): 我使用pip install selenium 发现先爆出一大段黄色警告日志,最后是两段红色的错误日志,无法成功 ...

  7. python下载文件到本地-Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io imp ...

  8. python写错了怎么更改-Python中修改字符串的四种方法

    在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符. 因此改变一个字符串的元素需要新建一个新的字符串. 常见的修改方法有以下4种. 方法1:将字符串转换成列表后修改值,然后用joi ...

  9. Perl,Python,Ruby,Javascript 四种脚本语言比较

    Perl 为了选择一个合适的脚本语言学习,今天查了不少有关Perl,Python,Ruby,Javascript的东西,可是发现各大阵营的人都在吹捧自己喜欢的语言,不过最没有争议的应该是Javascr ...

最新文章

  1. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)
  2. 人群密度估计--Leveraging Unlabeled Data for Crowd Counting by Learning to Rank
  3. 自学python有哪些网站-python有哪些学习网站
  4. [Go] Cookie 使用简介
  5. Oracle char 查询问题
  6. 深度学习之递归神经网络(Recurrent Neural Network,RNN)
  7. AndroidStudio_Android中使用非阻塞延迟的方法_利用Handler实现---Android原生开发工作笔记218
  8. python global nonlocal
  9. PAT (Basic Level) Practice1029 旧键盘
  10. (转)吴寿鹤:区块链中的软分叉与硬分叉详解
  11. 第八讲 函数直接展开成幂级数
  12. 算法交易的机遇和挑战
  13. HTML网页设计制作——响应式网页影视动漫资讯bootstrap网页(9页)
  14. openwrt修改默认网关地址_非常详细的锐捷网关路由配置教程,适合新手小白
  15. 中国各地区政府招投标数据
  16. 阿里P6工作四年,女友跑路、晋升无望、年薪45W买不起房,加班加到焦虑!
  17. 55. VUE 导航守卫
  18. 如何连接小米空调伴侣2
  19. idea中摸鱼插件_上班防摸鱼插件(知乎页面)
  20. Python *和**用法

热门文章

  1. 李弘毅机器学习笔记:回归演示
  2. PHPEMS修改原后台登录验证码样式
  3. Android获取电池电量信息的几种方式
  4. 那些年我们一起的CSDN
  5. ALIos与android区别,安卓系统和ios系统的区别
  6. 雷观(十九):我的人生观
  7. 回首系列01: 假如我的人生就像是在炒股
  8. 【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
  9. JS将图片转化为base64编码,并实现点击下载,js实现图片下载的实操博客
  10. 苏州软件评测中心有限公司招聘信息