数字三角形

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1

输入描述

输入的第一行包含一个整数 N(1≤N≤100),表示三角形的行数。

下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

输出描述

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

输入输出样例

示例

输入

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

输出

27

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

如果一开始没提醒我们使用动态规划来做我们又会怎么做,首先我们用二维数组来存储一下我们的数字三角形是绝对都能想到的,为了更清晰,我就把他画的比较直观一点(用树来表示了)

思路

根据题意,我们是要从上面下来算出最大的值的,一开始我是想用辅助数组来存储各个值相加看出来那个最大的,但是那样就太麻烦了,我们可以直接修改我们的数字三角形来获得我们的路径值

问题来了,分支算法能用么?我们发现我们走的每一步都不一定是相同的,也就是说我们走的每一步都是独立的,谁知道你走的这一步是不是最大的值呢?

也就是说我们得考虑动态规划的方式,我们下一步的走法跟上一步的结果是有关系的,是建立在上一步的基础上的,挺符合我们的动态规划的

只能走下一行相邻的数字路径,每一步都这样,这是相同点,下一步的结果是在上一步结果基础上建立的。都符合动态规划所以使用动态规划

代码

public class 数字三角形 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);//在此输入您的代码...//1.二维数组来存储我们的三角形//1.1我们的行数int N = scan.nextInt();int[][] arr = new int[N+1][N+1];//1.2生成数字三角形for (int i = 1; i <= N; i++) {for (int j = 1; j <= i; j++) {arr[i][j] = scan.nextInt();}}//2.计算我们的最大值for (int i = 1; i <= N; i++) {for (int j = 1; j <= i; j++) {arr[i][j] = arr[i][j] + Math.max(arr[i-1][j], arr[i-1][j-1]);}}//if(N%2 != 0){System.out.println(arr[N][N/2+1]);}else{System.out.println(Math.max(arr[N][N/2+1],arr[N][N/2]));}scan.close();}
}

一开始我也不知道是个什么解法,因为以前没见过,只能一步一步debug来理解他的思想,挺简单的画个图就好理解了

第一步

arr [1]1 = arr[1] 1 + max[0][1没意义,我们第一轮没啥结果

第二步

i = 2 j = 1

arr[2][1] = arr[2][1] + Math.max(arr[1][1], arr[1][0]); ==>  10

i = 2 j = 2

arr[2][2] = arr[2][2] + Math.max(arr[1][2], arr[1][1]);=  8        +       0         7   = 15

第三步

i = 3 j = 1

arr[3][1] = arr[3][1] + Math.max(arr[2][1], arr[2][0]); ==>8  +      (10,0)     =   18

i = 3 j = 2

arr[3][2] = arr[3][2] + Math.max(arr[2][2], arr[2][1]); ==>  1    +   (15,10)      =  16

i = 3 j = 3

arr[3][3] = arr[3][3] + Math.max(arr[2][3], arr[2][2]); ==> 0 +      (0,15)           =    15

第四步

相同的步骤变成了

最后变成

我们又有一个疑问就是,我们明明30最大为什么答案是27呢

主要是我们的题目要求了向左下走的次数与向右下走的次数相差不能超过 1,这点怎么理解呢

你看看30怎么来 7 3 8 7 5其中 7 3 8 5右下走了3次,而7只有一次走了左下,不符合题意,那么我们就明白了,只要是不能相差超过1,那肯定是在中间的那个值所以是27

动态规划题目-------蓝桥杯真题-------蓝桥杯备战相关推荐

  1. 最大公共子串-蓝桥杯真题 动态规划(c++实现)

    上文链接:蓝桥杯真题之"方格分裂"_DFS深度搜索(c++实现) 最大公共子串 有两个字符串(可能包含空格),请找出其中最长的公共连续子串,输出其长度. 比如"qwerf ...

  2. 第五届蓝桥杯真题解析【JavaC组】

    第五届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第五届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:等额本金 C:猜字母 D:大衍数列 ...

  3. 蓝桥杯python省赛冲刺篇2——常用算法的详细解析及对应蓝桥杯真题:打表模拟法、递推递归法、枚举法、贪心算法、差分与前缀和

    注意:加了题目链接 目录 注意:加了题目链接 一.打表模拟法 介绍 1. 算式问题 题目描述 解析与代码演示 2. 求值 题目描述 解析与代码演示 3. 既约分数 题目描述 解析与代码演示 4. 天干 ...

  4. 蓝桥杯真题2017-2021

    刷完近几年真题,感觉理解完之后,拿奖问题不大,本人这次获得2022年蓝桥杯javaB组省一,以下是历年javaB组省赛题目. 文章目录 2017年真题 一.购物单 二.纸牌三角形 三.承压计算 四.魔 ...

  5. 第四届蓝桥杯真题解析【JavaC组】

    第四届蓝桥杯真题解析[JavaC组] 业精于勤,荒于嬉:行成于思,毁于随.--韩愈 文章目录 ***第四届蓝桥杯真题解析[JavaC组]*** 前言 A:猜年龄 B:组素数 C:马虎的算式 D:第39 ...

  6. python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在19351936年应邀来中国清华大学讲学。。。

    python解答蓝桥杯真题2 猜年龄 美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学.他曾在1935~1936年应邀来中国清华大学讲学... 问题描述 全排列模板: 美国数学家维纳(N. ...

  7. 【蓝桥杯真题】16天冲刺 Python

    距离比赛很快了,希望和我一起准备的PY党能更加熟练的掌握Python! 1.距离和(模拟赛填空题) 问题描述: 两个字母之间的距离定义为它们在字母表中位置的距离.例如 A和 C 的距离为 2,L 和  ...

  8. 蓝桥杯真题:三羊献瑞

    蓝桥杯真题:三羊献瑞 观查下面的加法算式: 其中相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. 分析 ...

  9. # 2014年蓝桥杯真题CC++B组

    2014年蓝桥杯真题C/C++B组 1.啤酒和饮料 题目描述 啤酒每罐2.3元,饮料每罐1.9元,小明买了若干啤酒和饮料,一共花了82.3元. 我们还知道她买的啤酒比饮料的数量多,请你计算他买了几罐啤 ...

  10. 第十届蓝桥杯c语言试题,第十届蓝桥杯真题编程题1-7解析(高级组).pdf

    scratch 少儿编程第十届蓝桥杯真题 7 大家好 ~今天我们来讲解 scratch 蓝桥杯第十届编程大题的第七道题. 同样,这道题也是非常有难度的一道题.一起来看一下吧 解析: 女孩的程序 1.在 ...

最新文章

  1. 减少亚稳态导致错误,提高系统的MTBF
  2. 一些SAP UI5的学习笔记
  3. XPE下关闭自动播放功能的方法
  4. 如何利用Python播放和录制声音
  5. 将图像顺时针旋转90度c语言,高中信息技术试卷|信息技术试卷下载_21试卷_21世纪教育网...
  6. 把数据对象转成字符串_Android Json数据的转换
  7. 使用AndroidStudio编译NDK的方法及错误解决方式
  8. jquery怎么选择 某个指定id的div下面的第2个子div再设置css?
  9. 虚拟机服务器坏处,服务器虚拟化技术的优缺点
  10. css实现剪切蒙版,CSS3“蒙版(剪切路径)”: clip-path
  11. Catching Both Gray and Black Swans: Open-set Supervised Anomaly Detection(捕捉灰天鹅和黑天鹅:开放集监督异常检测)
  12. linux 6.7 远程端口,CentOS6.7安装vncserver及xrdp实现远程桌面
  13. 企业如何做软文营销推广?
  14. 解决高铁WiFi上网问题,中兴新支点ICG与高铁强强联手
  15. android:简单包装实现伪自定义DatePickerDialog和TimePickerDialog
  16. 表空间的相关查询命令
  17. python爬虫学习笔记(三)——淘宝商品比价实战(爬取成功)
  18. 使用GifCam录制程序演示效果图GIF(基于模拟器录制)
  19. 一起学Python吧~Python3调用Ansible项目实战
  20. 安防云服务器nvr,安防行业:NVR=平台+存储 | 求索阁

热门文章

  1. 小学计算机兴趣小组计划书,兴趣小组计划
  2. windows应用x64和x86运行效率_现在你可以在 Windows 中运行 Linux 应用了 | Linux 中国...
  3. mysql 计算math_MySQL Math – 可以在查询中计算相关性吗?
  4. Javascript特效:不断在页面跑的星星
  5. 高效的CSV文本处理利器——univocity-parsers
  6. Java中的几种设计模式:行为型模式
  7. SLAM和三维重建中的SFM区别
  8. 第一次敲hdu蟠桃树和第二次的区别
  9. Inkscape软件的使用与处理svg格式图片
  10. SDOD: Real-time Segmenting and Detecting 3D Objects by Depth(实时3D检测与分割)