题目描述

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

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

输入描述

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

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

输出描述

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

输入输出样例

示例

输入:

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

输出:

27

运行限制

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

解题思路:

该题较经典动态分布算法题数字三角形有一个新的条件要求就是路径左右次数差不能大于 1,我们先来看一下如果没有这个要求的话该题该如何求解,知道经典解法之后就很容易就能接收这道题的解法了。

首先,拿这道题给的例子来分析。

对于这道题我们很容易想到使用一个二维矩阵来存储数据,这是可行的。若题目没有要求说向左下走的次数与向右下走的次数相差不能超过 1 的话,我们可以从矩阵的倒数第二行开始考虑,使用动态规划的思想进行求解。例如对于第 4 行 1 列的数据 2,他的前一个(从后往前考虑)数据可能是第 5 行 1 列的 4,也有可能是第 5 行 2 列的 5,那么我们可以判断得出,前一个数是 5 的时候和较大,故该路线的下一个目标是第 5 行 2 列的 5,所以我们可以把该矩阵的第 4 行 1 列的位置数值改为 7 (2 + 5),以此类推对矩阵的前 n - 1 行进行该操作,最后矩阵的第 1 行 1 列的位置数值即是路径的最大和。

对于这道题加入了一个新的条件,那么可以看到,也是一样拿这道题给的例子来说,若要求左右相差不能超过 1,则从矩阵最上面位置出发,不能到达的位置有下面这几个 (没有值的位置):

大家可以自行想一下,若左右次数相差不能超过 1 的话,对于这个五行的矩阵来说,需要往下走四步,那么可以有 1 左 3 右、2 左 2 右、2 右 2 左、3 左 1 右的四种走法,在这四种走法中只有中间两个方法是可行的,而通过中间两种走法走出来的路线所经过的位置是没有经过矩阵空白位置的,故这些位置可以考虑赋值为 0,如下图:

然后我们就可以按照上面讲的动态规划思想去解答这道题即可。该算法的 Java 代码实现如下:

import java.util.Scanner;
public class Main {static int DP(int[][] arr) {int N = arr.length;for (int i = N - 2; i >= 0; i--) {for (int j = 0; j <= i; j++) {arr[i][j] += Math.max(arr[i + 1][j], arr[i + 1][j + 1]);}}return arr[0][0];}public static void main(String[] args) {Scanner scan = new Scanner(System.in);int N = scan.nextInt();int[][] arr = new int[N][N];int i, j, k, revise;for (i = 0, revise = - (N / 2); i < N; i++, revise++) {//题目初始化for (j = 0; j <= i; j++) {arr[i][j] = scan.nextInt();}for (k = 0; k < revise; k++) {arr[i][k] = 0;arr[i][i - k] = 0;}}System.out.println(DP(arr));scan.close();}
}

算法 — 数字三角形相关推荐

  1. 经典算法——数字三角形的三种解题方法:递推、记忆化搜索、动态规划

    上题目链接: http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/1730.html  递推方法: i ...

  2. 数字三角形路径最小值c语言题目,算法学习——动态规划之点数值三角形的最小路径...

    算法描述在一个n行的点数值三角形中,寻找从顶点开始每一步可沿着左斜或者右斜向下直到到达底端,使得每个点上的数值之和为最小 右图为一个4行的点数值三角形 算法思路接收用户输入行数n 使用一个二维数组a[ ...

  3. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  4. 算法设计与分析——动态规划——数字三角形问题

    数字三角形问题 1.题目描述:给定一个由n行数字组成的数字三角形,如图3-7所示.设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计:对于给定的由n行数字组成的数字 ...

  5. java 蓝桥杯算法训练 数字三角形(题解)

    试题 算法训练 数字三角形 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的 ...

  6. 计算机算法设计与分析 数字三角形

    3数字三角形问题:: 给定一个有n行数字组成的数字三角形,如下图所示: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 设计算法,计算从三角形的顶端至底的一条路径,使该路径经过的数字总和最 ...

  7. 算法设计与分析之数字三角形问题(C++解法)

    算法设计与分析之数字三角形问题 前言 问题描述 确定数据存储方式 确定分析方法 编码 顺推法 逆推法 前言 此文章完成数字三角形问题的简便算法,如果文中有错请给予反馈,刘某不胜感激 问题描述 确定数据 ...

  8. 蓝桥杯——算法训练——数字三角形

    蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...

  9. 计算机算法设计与分析——数字三角形问题

    计算机算法设计与分析(算法实现题3) 3-4 数字三角形问题 问题描述: 给定一个由n行数字组成的数字三角形.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 算法设计: ...

最新文章

  1. OpenCV代码提取:flip函数的实现
  2. 项目前期——用例图、类图、活动图、组件图
  3. 前端工程师需要掌握的技能
  4. Android学习笔记---后台运行方法
  5. 今日头条野心背后逃不过的10个问题
  6. html语言闪烁特效代码,css3 文字闪烁特效代码
  7. 如何在一场面试中展现你对Python的coding能力?
  8. asp.net core web api token验证和RestSharp访问
  9. Linux 和 Windows 下实现多进程的方式以及管道操作
  10. Xtrabackup--InnoDB备份工具介绍(1)
  11. 计算机网络技术练习,计算机网络技术基础各章节综合练习题及答案
  12. 经济机器是怎样运行的(文字版)-瑞.达利欧
  13. 【周五松土】私家萝卜与坑
  14. NIOS II——PIO寄存器分析及使用
  15. 如何用电影摄影来破解大脑
  16. xpdf工具(PDF转图片工具)
  17. HDU 1874 畅通工程续 Floyd
  18. Redis数据库 专题
  19. 0.《解密:网络营销推广实战和流量变现公式》
  20. 图论入门六:哥尼斯堡七桥问题

热门文章

  1. linux中的fs文件夹,linux上使用eCryptFS加密文件夹的方法
  2. php 图片木马检测
  3. 站斧浏览器——用实力,说实话
  4. MeanShift算法理解
  5. linux 使用设备树点亮LED 实战
  6. 求学之路五、六月的Review
  7. Redis记录:Invalid argument during startup: Failed to open the .conf file
  8. Word开发工具Aspose.Words功能演示:在C ++中以编程方式在Word文档中添加或删除页眉和页脚
  9. 威步百科 | Blurry Box
  10. cannot have an existing value