Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数字三角形

数字三角形

作者头像
GeekLiHua
发布于 2025-01-21 11:48:56
发布于 2025-01-21 11:48:56
6600
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

数字三角形

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        7
      3   8
    8   1   0
  2   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

思路

状态表示:f(i,j)

  • 集合:从(i,j)到最后一层的所有方案
  • 属性:Max

状态计算

  • 这条路径可以从(i+1,j)走上来,即f(i+1,j)+ai
  • 也可以从(i+1,j+1)走上来,即f(i+1,j)+ai,j
  • 所以状态转移方程就是f(i,j)=max{fi+1,j,fi+1,j+1}+ai

答案:

  • 根据定义,答案就是f(1,1)

提交代码

c++版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
using namespace std;

const int N = 1010;
int f[N][N];
int n;

int main()
{
    cin >> n;
    for (int i = 1; i <= n; ++ i)
    {
        for (int j = 1; j <= i; ++ j)
        {
            scanf("%d", &f[i][j]);
        }
    }
    for (int i = n - 1; i >= 1; -- i)
    {
        for (int j = n - 1; j >= 1; -- j) // for (int j = 1; j <= i; ++ j) 也可以 但是要慢一些
        {
            f[i][j] += max(f[i + 1][j + 1], f[i + 1][j]);
        }
    }
    cout << f[1][1];
    return 0;
}

思路: 这道题我认为最容易错的点就是边界问题,并且如果是JAVA,容易有溢出问题。

一般就是就是向下走,和向上爬两种思路,向上爬的思路可以不需要考虑边界问题。

而当向下走的时候,需要考虑边界问题。也就是对于f[2][1]的时候,f[1]f[0]并没有设置这个值,默认为0,题中的数字有负数,则会出现错误的最大值。需要对于f进行重置,置为Integer.MIN_VALUE.

JAVA中最最容易错的点 :如果f[i][j]= Math.max(f[i - 1][j - 1] + a[i][j], f[i - 1][j] + a[i][j])其中的f[i - 1][j - 1]如果为Integer.MIN_VALUE,并且a[i][j] = 负数时候,会溢出!!!需要写成 Math.max(f[i - 1][j - 1] + f[i - 1][j]);

Java版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Scanner;

public class Main {
    public static void main (String[] args) {
        int[][] a = new int[510][510];
        int[][] f = new int[510][510];
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        for (int i = 1; i <= n; i ++) {
            for (int j = 1; j <= i; j++) {
                a[i][j] = sc.nextInt();
            }
        }

        for (int i = n; i >= 1; i--) {
        //从最后一排开始走,从下往上。
            for (int j = 1; j <= i; j++) {
                f[i][j] = Math.max(f[i + 1][j + 1], f[i + 1][j]) + a[i][j];
            }
        }

        System.out.println(f[1][1]);
    }
}

思路: 状态表示:dp[i][j]dp[i][j]表示到ijij的数值最大值; 状态计算:dp[i][j]=v[i][j]+max(dp[i−1][j−1],dp[i−1][j])

Python版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
n = int(input())
v = [[0 for _ in range(n + 1)] for _ in range(n + 1)]

for i in range(1, n + 1):
    in_ = list(map(int, input().split()))
    v[i][1:len(in_) + 1] = in_

INF = 10001
dp = [[-INF for _ in range(n + 1)] for _ in range(n + 1)]
dp[1][1] = v[1][1]
for i in range(2, n + 1):
    for j in range(1, i + 1):
        dp[i][j] = v[i][j] + max(dp[i - 1][j - 1], dp[i - 1][j])
print(max(dp[n][1:]))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
DP问题首先考虑状态转移方程,定义一个集合f ( i , j) ,表示从第一个数字(1,1)走到第 i行,第 j列(i , j)的所有方案的集合,那么我们要求的就是其中方案的整数之和的最大值。
用户10604450
2024/03/15
1370
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
DP动态规划入门(数字三角形、破损的楼梯、安全序列)
动态规划(Dynamic Programming,简称DP)是运筹学的一个分支,它是一种通过将复杂问题分解成多个重叠的子问题,并通过子问题的解来构建整个问题的解的算法。在动态规划中,有几个核心概念需要理解:
走在努力路上的自己
2024/03/23
6300
DP动态规划入门(数字三角形、破损的楼梯、安全序列)
1220 数字三角形
1220 数字三角形  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Description 如图所示的数字三角形,从顶部出发,
attack
2018/04/12
6710
1220 数字三角形
算法竞赛动态规划篇——数字三角形模型
分析:本题是一道非常经典的dp问题,数字三角形问题可以从上往下走来寻找最大路径,也可以从下往上走来寻找最大路径,我们可以发现从上往下走我们要分析每个数是怎么走到这里的,比如0这个数字,只能从左边走过来,右边走不过来,这样我们就多了许多特判的问题,增加了代码的复杂性。我们再看从下往上走的情况,再看0这个数字,它可以走到他下面的任何两个4,这就省略了边界的问题,所以这道题目采用从下到上的方式最为简单,事实上,这也是这道题目的最优解,同学们做题目做多了自然也就掌握了。
战士小小白
2022/07/08
3290
算法竞赛动态规划篇——数字三角形模型
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 杨辉三角形(最好的基础题,没有之一)
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 杨辉三角形(最好的基础题,没有之一)
红目香薰
2023/02/16
4700
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 杨辉三角形(最好的基础题,没有之一)
蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)
首先,需要明确问题的要求:给定n种不同的花和每种花的最大数量限制,求出在摆放m盆花时,能够形成的不同摆花方案数。这个问题的关键在于每种花可以选择摆放的数量从0到其最大限制,且摆放的花必须按照花的种类顺序排列。
走在努力路上的自己
2024/03/26
1430
蓝桥杯练习题总结(三)线性dp题(摆花、数字三角形加强版)
算法训练 数字三角形
问题描述   (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路   径,使该路径所经过的数字的总和最大。   ●每一步可沿左斜线向下或右斜线向下走;   ●1<三角形行数≤100;   ●三角形中的数字为整数0,1,…99;
AI那点小事
2020/04/20
5660
算法训练 数字三角形
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-124 数字三角形
        这段时间我会把蓝桥杯官网上的所有非VIP题目都发布一遍,让大家方便去搜索,所有题目都会有几种语言的写法,帮助大家提供一个思路,当然,思路只是思路,千万别只看着答案就认为会了啊,这个方法基本上很难让你成长,成长是在思考的过程中找寻到自己的那个解题思路,并且首先肯定要依靠于题海战术来让自己的解题思维进行一定量的训练,如果没有这个量变到质变的过程你会发现对于相对需要思考的题目你解决的速度就会非常慢,这个思维过程甚至没有纸笔的绘制你根本无法在大脑中勾勒出来,所以我们前期学习的时候是学习别人的思路通过自己的方式转换思维变成自己的模式,说着听绕口,但是就是靠量来堆叠思维方式,刷题方案自主定义的话肯定就是从非常简单的开始,稍微对数据结构有一定的理解,暴力、二分法等等,一步步的成长,数据结构很多,一般也就几种啊,线性表、树、图、再就是其它了。顺序表与链表也就是线性表,当然栈,队列还有串都是属于线性表的,这个我就不在这里一一细分了,相对来说都要慢慢来一个个搞定的。蓝桥杯中对于大专来说相对是比较友好的,例如三分枚举、离散化,图,复杂数据结构还有统计都是不考的,我们找简单题刷个一两百,然后再进行中等题目的训练,当我们掌握深度搜索与广度搜索后再往动态规划上靠一靠,慢慢的就会掌握各种规律,有了规律就能大胆的长一些难度比较高的题目了,再次说明,刷题一定要循序渐进,千万别想着直接就能解决难题,那只是对自己进行劝退处理。加油,平常心,一步步前进。
红目香薰
2023/02/16
2080
[动态规划] 数字三角形问题(一维数组实现)
一个数字三角宝塔。设数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数小于等于100编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。 例如一个行数为5的三角形如下:
孟君
2019/10/10
7700
OJ:数字三角形(搜索)
两种方法给我们提供了不同的解题方向,第一种就是暴力求解,只要掌握基本逻辑,第二种循环才是要培养的思维方式。
用户11396661
2024/12/09
1000
OJ:数字三角形(搜索)
2189 数字三角形W
2189 数字三角形W 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 数字三角形 要求走到最后mod 100最大 输入描述 Input Description 第1行n,表示n行 第2到n+1行为每个的权值 输出描述 Output De
attack
2018/04/13
4730
算法__数字三角形
#include<iostream> using namespace std; int main() { int n,i,j,a[101][101]; cin>>n; for (i=1;i<=n;i++) for (j=1;j<=i;j++) cin>>a[i][j]; //输入数字三角形的值 for (i=n-1;i>=1;i--) for (j=1;j<=i;j++) { if (a
Twcat_tree
2022/11/29
3380
算法__数字三角形
数字三角形问题
给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
且陶陶
2023/04/12
2470
数字三角形问题
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-449 递归输出数字三角形
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-449 递归输出数字三角形
红目香薰
2023/02/17
2600
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-449 递归输出数字三角形
LeetCode 120.三角形的最小路径和(二维DP)
题目描述 给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
lexingsen
2022/02/24
1530
LeetCode 120.三角形的最小路径和(二维DP)
做题总结——数字三角形
先介绍一种解法。这道题目可以利用“杨辉三角”的思路,根据一个上面的元素与下面两个元素的递推公式(在动态规划里面称作状态转移方程),从下至上地解决此问题(详细思路以后再补)
用户8224910
2021/01/26
3030
做题总结——数字三角形
数字三角形问题 动态规划
数字三角形问题 动态规划 OJ 问题:Triangle(参见 http://poj.org/problem?id=1163) 题意:在数字三角形上寻找一条沿相邻顶点从顶到底走的路径,使路径上的数字和最
一只胡说八道的猴子
2020/10/31
4670
数字三角形问题 动态规划
动态规划专题刷题记录①:数字三角形
寒假打算集中学习一下动态规划内容,吃灰好久的AcWing提高课正好有一个比较全面的DP专题,希望寒假可以刷完整个专题,边学边记录。
Here_SDUT
2022/06/29
9370
动态规划专题刷题记录①:数字三角形
动态规划篇——线性DP
动态规划篇——线性DP 本次我们介绍动态规划篇的线性DP,我们会从下面几个角度来介绍: 数字三角形 最长上升子序列I 最长上升子序列II 最长公共子序列 最短编辑距离 数字三角形 我们首先介绍一下题目: /*题目概述*/ 给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层 要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 0 2 7 4 4
秋落雨微凉
2022/11/30
3750
算法:7-2 最大三角形
有一个游戏,玩法是在一堆长度不一的小棍中找出三根棍子,拼出一个周长最大的三角形。有什么策略能快速的找到三根小棍么? 请你来试试吧
小颜同学
2023/08/24
2290
推荐阅读
相关推荐
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验