蓝桥杯:数字三角形

news2025/1/12 1:09:32

目录

题目描述

输入描述

输出描述

输入输出样例

输入

输出

思路:

AC代码(Java):


题目描述

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

        路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数

        此外,向左下走的次数与向右下走的次数相差不能超过 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

思路:

        一开始我以为是简单的求最大路径和,啪的一下状态转移方程就出来了,直接从下往上,从倒数第二层往上累加,dp[i][j] += Math.max( dp[i+1][j] , dp[i+1][j+1])。

        啪的一下打印dp[0][0],很快啊,就拿了3分。

         

        看到3分还愣了一下,才反应回去看题目,注意看红色标注的部分!!!那里是这道题的关键。 

        我们先假设一个N=5的三角形

        

向左下,或者向右下走的话,先看第一行:

 

也就是可以走序号为2或者序号为3的节点,再看第三行:

 

能走的只有序号为5的节点,为什么呢?因为如果连续两行都走最左边或者最右边,就不满足题目要求了(标红部分)。依次类推,我们再看第四行:

        第四行也是同理,因为第三行能走的,只有序号为5的节点,也就是说,第四行也只能从8或者9选一个来走,至于7和10是肯定不行的(因为上一行的节点也不满足题目条件)。

        接着到第五行,就能看出规律了:

        

        好像回到了奇怪的起点是嘛?其实这样画个图,这道题的特点就出来了。

        能走,或者说能选的节点,是有限的,当N为奇数的时候(第一行,第三行,第五行),只能选中间的节点;当N为偶数的时候(第二行,第四行)可以选中间的两个节点,根据题目要求,我们就需要选出这两个节点中的最大的一个节点即可。

        这道题的核心规律我们找到了,就是根据N来选择节点。那么节点该如何进行计算呢?题目不止要求 向左下走的次数与向右下走的次数相差不能超过 1。  还要求找到最大的和。

        根据题目要求来想,我们的答案肯定是在最后一层的,也就是说,我们需要将上一层对应位置也选出最大的两个值,上一个也是,根据dp的定义,所以要从第二行开始计算添加上第一行的对应位置的最大值,也就是说,我们是从上往下进行状态转移。

        接下来找一下状态转移方程。

        照例,先把题目的数据再粘贴一份,方便后面对比和进行查找:

5 //三角形的行数
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

        假设第二行的第一个数字,因为第一行只有一个数字,那么第二行的两个值都是只能加上第一行的数值,所以看不出什么。

        PS:这里的第二行,分别是3+7和8+7哦,之后同理。

        

        再看第三行,因为题目要求,从上往下走,只能走左下或者右下。

        

        因为第三行的8,只有10经过它,所以只能选10,也就是8+10。然后第三行的1,因为10和15 都经过它,所以它可以选二者之中的最大值,也就是15,所以是1+15。第三行的0,同理,只有15经过它,它也只能+15。

        其实到这里,状态转移方程就可以看出来了,怕大家还是有点懵,我直接把5行都说完,在讲规律,或者说状态转移方程。

        继续看第四行:

        

         第四行的四个节点分别是2,7,4,4。怕大家忘记,我先写出来,再继续找。

                第一个节点是2,只有18经过它,所以它的值只能为2+18 = 20

                第二个节点是7,有18和16经过它,所以选最大值18,得到7+18 = 25

                第三个节点是4,有16和15经过它,所以选最大值16,得到4+16 = 20

                第四个节点是4,只有15经过它,所以它的值只能为4+15 = 19。

        继续看第五行:

        

         第五行有5个节点,分别是4,5,2,6,5

                第一个节点,因为只有20经过它,所以它的值只能是4+20 = 24

                第二个节点,有20和25经过它,所以选最大值25,5+25 = 30

                第三个节点,有25和20经过它,所以选最大值25,2+25 = 27

                第四个节点,有20和19经过它,所以选最大值20,6+20 = 26

                第五个节点,只有19经过它,所以它的值只能是5+19 = 24。

        其实到这里,大家都应该发现规律了吧?

        从第二行开始,它的状态转移方程有两种情况:

  1. 当前节点是该行的第一个节点,它的值只能加上上一行的第一个节点
  2. 它的值就是加上上一行的前一个节点,上一行的当前节点,两个节点中的最大值     
  3. 最后一个节点不也是只添加上一个的最后一个节点嘛?因为我们开数组的时候,会防止下标越界,同时也方便处理,会多开一列,所以我们可以看作,每一行还多出一个为0的节点,这样最后一个节点也可以使用第二种情况了。          

        所以状态转移方程就是

        为第一个节点时 dp[i][j] += dp[i-1][j];

        其他情况时 dp[i][j] += Math.max( dp[i-1][j-1] , dp[i-1][j] );

        然后根据N的奇偶情况,选择最后一行的对应节点输出即可。

        选择对应节点:N为奇数时,选择中间的节点。N为偶数时,选择中间两个节点的最大值节点

AC代码(Java):

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int[][] dp = new int[N][N+1];
        for(int i = 0;i<N;i++){
          //第二行的数字数量是i+1
          for(int j = 0;j<i+1;j++){
            dp[i][j] = scan.nextInt();
          }
        }
        //因为题目是要求,向左下走的次数与向右下走的次数相差不能超过 1。也就是要从最后一层开始查找结果,dp就自上向下
        for(int i = 1;i<N;i++){
          for(int j = 0;j<i+1;j++){
            //如果是每一行的第一个,只能加上上一行的第一个,否则就是上一行的前一个和上一个的对应位置
            dp[i][j] += j==0 ? dp[i-1][j] : Math.max(dp[i-1][j-1],dp[i-1][j]);
          }
        }
        //如果N是奇数,那么最后一行只有一个值可以满足
        //如果N是偶数,那么需要在两个节点中间找到最大的那个节点
        int ans = N%2 == 0 ? Math.max(dp[N-1][N/2],dp[N-1][N/2-1]) : dp[N-1][N/2];
        System.out.println(ans);
        scan.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构基础--排序

一、直接插入排序 思路&#xff1a; 直接插入排序是一种简单的插入排序法 其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一 个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 直接插入排序的特性总…

二分查找算法

目录 一 算法简介 1&#xff09;算法解释 2&#xff09;前提 3&#xff09;思想 4&#xff09;分类 5&#xff09;算法模板 mid的计算的实现方法 二分法模板 求某个数的平方根: 二 算法实践 1&#xff09;问题引入 2&#xff09;问题解答 1)解法一&#xff1a;左闭…

[附源码]Node.js计算机毕业设计关山社区居民信息管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

Nacos认证绕过漏洞(CVE-2021-29441)

Nacos认证绕过漏洞&#xff08;CVE-2021-29441&#xff09; 指纹识别 titlenacos漏洞范围 nacos1.2.0版本-nacos1.4.0版本 漏洞复现 靶机ip:192.168.1.4 默认的nacos登录界面 http://192.168.1.14:8848/nacos/#/login利用如下请求包查看只有一个nacos用户 GET /nacos/v…

ZBC陆续在主要CEX开启Staking,锁定市场大部分流通量成大利好

从2022年Q3开始&#xff0c;Zebec生态开始不断的迎来新的利好&#xff0c;比如以 10 亿美元的完全稀释估值筹集了 850 万美元&#xff0c;使其历史融资额超过4000万美元&#xff0c;引发ZBC通证的一波上涨。而在此后&#xff0c;Zebec 生态开启了从Solana生态的迁移&#xff0c…

Eclipse+Java+Swing+mysql实现学生宿舍管理系统

EclipseJavaSwingmysql实现学生宿舍管理系统一、系统介绍1.环境配置二、系统展示1.登录页2.学生主页面3.学生端-登记页面4.学生端-学生信息修改5.学生端-寝室信息查询6.学生端-学生信息查询7.学生端-退出登录8.管理员-主页面9.管理员-宿舍信息修改10.管理员-宿舍信息删除11.管理…

JQuery | 系统性学习 | 无知的我费曼笔记

无知的我已经复盘完成JQuery 。。。 文章目录JQuery概述入口函数特性-隐式迭代Dom和JQuery区别互相转化JQuery选择器基本和层级选择器筛选选择器后缀筛选方法筛选应用排他思想应用链式编程JQuery操作样式修改样式CSS修改类名JQuery效果基础效果显示效果隐藏效果切换效果滑动效果…

Springboot 使用redis检测浏览量,评论量,点赞量的变化并完成与mysql的交互(有具体实现,有具体需求)

目录 依赖 准备实体类与业务类 开始正题 实现一览 流程一览 具体实现 1 初始化 2 写浏览量增加的方法 3 在切面处检测浏览器变化 4 新增文章时将新的数据写入redis 5 删除文章时将数据从Redis中删除 6 书写将数据写入mysql数据库的方法 7 销毁的时候将数据写入my…

一文搞懂百万富翁问题

百万富翁问题1. 解决方案2. 协议描述3. 协议说明4. 协议举例两个百万富翁Alice和Bob想知道他们两个谁更富有&#xff0c;但他们都不想让对方及其他第三方知道自己财富的任何信息&#xff0c;这是由中国计算机科学家、2000年图灵奖获得者姚启智教授于1982年在论文《Protocols fo…

新手小白做跨境电商有哪些注意的地方?

近两年&#xff0c;受疫情刺激&#xff0c;线上电商出现前所未有的高速增长&#xff0c;中国品牌纷纷出海&#xff0c;跨境电商腾飞。此外&#xff0c;国内电商市场发展趋于平淡&#xff0c;市场需求不断萎缩&#xff0c;也让越来越多的大卖家和平台盯上了这块大蛋糕。不仅中小…

300左右半入耳蓝牙耳机推荐:南卡、漫步者、JBL蓝牙耳机谁值得入手?

现在的年轻人&#xff0c;出门都会随身携带的一副蓝牙耳机&#xff0c;所以很多品牌商加入其中&#xff0c;导致大多数人选购难度变大&#xff0c;很多人总是不知道哪个不知道品牌蓝牙耳机最好&#xff0c;半入耳式蓝牙耳机相比入耳式蓝牙耳机有着天然的舒适性&#xff0c;因而…

如何利用MOS管设计一个LED亮度可调电路

首先大家可以看下下面的MOS管亮度可调的演示视频 如何利用MOS管设计一个LED亮度可调电路这个电路大致电路图如下 MOS管的栅极放了一个电容&#xff0c;当按按键1的时候&#xff0c;电源通过R1给电容充电&#xff0c;&#xff0c;MOS管栅极的电压慢慢增大&#xff0c;流过MOS管的…

计算机毕业设计HTML+CSS+JavaScript——基于HTML花店购物网站项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Essential singularity

In complex analysis, an essential singularity of a function is a “severe” singularity near which the function exhibits odd behavior. The category essential singularity is a “left-over” or default group of isolated singularities that are especially unm…

跳转指令 —— B、BL

跳转指令可以跳转到标号的下一条指令&#xff0c;本质就是修改了PC寄存器的值。&#xff08;标号并非指令&#xff0c;只是用来定位&#xff0c;相当于记录了当前位置的下一条指令的地址&#xff09; 这里的MAIN就是一个标号 MAIN: MOV R1, #1 这里的FUNC就是一个标…

实验3 路由器基本配置及路由配置

实验3 路由器基本配置及路由配置一、实验目的二、实验要求三、实验步骤&#xff0c;数据记录及处理四&#xff0e;实验总结一、实验目的 1、路由器几种模式。 2、基本的配置命令。 3、路由器各接口的配置方法。 4、会查看检测接口状态。 二、实验要求 写出自己学习使用了哪些…

Redis框架(十五):大众点评项目 共同关注方案实现?双指针筛选DB数据:Redis取交集

大众点评项目 好友关注 共同关注需求&#xff1a;好友关注 共同关注业务逻辑展示点击关注功能实现判断当前用户是否关注了此博主共同好友列表查询业务逻辑实现双指针筛选DB数据Redis取交集总结SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节…

字节一面:select......for update会锁表还是锁行?

select查询语句是不会加锁的&#xff0c;但是select .......for update除了有查询的作用外&#xff0c;还会加锁呢&#xff0c;而且它是悲观锁。 那么它加的是行锁还是表锁&#xff0c;这就要看是不是用了索引/主键。 没用索引/主键的话就是表锁&#xff0c;否则就是是行锁。…

sklearn基础篇(十)-- 非负矩阵分解与t-SNE

1 非负矩阵分解(NFM) NMF(Non-negative matrix factorization)&#xff0c;即对于任意给定的一个非负矩阵V\pmb{V}VVV&#xff0c;其能够寻找到一个非负矩阵W\pmb{W}WWW和一个非负矩阵H\pmb{H}HHH&#xff0c;满足条件VW∗H\pmb{VW*H}VW∗HVW∗HVW∗H,从而将一个非负的矩阵分解…

物联网架构实例—解决Linux(Ubuntu)服务器最大TCP连接数限制

1.前言&#xff1a; 在对物联网网关进行压测的时候&#xff0c;发现在腾讯云部署网关程序&#xff0c;设备接入数量只能达到4000多个长连接&#xff0c;之后就再也无法接入终端了。 之前在阿里云部署的时候明明可以到达2万左右&#xff0c;而且腾讯云的这个服务器比阿里云的硬…