[蓝桥杯]接龙数列(C语言)

news/2024/11/28 21:00:26/

目录

题目链接

题目理解

解题思路

完整代码 

重难点解答

*dp数组的具体用法

*对于dp[b]=dp[a]+1>dp[b]?dp[a]+1:dp[b]的解释


题目链接

    [蓝桥杯 2023 省 B] 接龙数列 - 洛谷

题目理解

    这道题让我们求任给的一串数字,若想让其变成接龙数列最少需要删除的数字个数。首先我们要明白什么是接龙数列。接龙数列是前一个数的末位数字与下一个数的第一位相同的数列(比如 37、798、888)。题目理解起来没什么难度,下面我们来讲一下解题思路。

解题思路

  这道题目的思路是找出给定数字序列中能够凑成的最长接龙序列,然后用总长度减去最长序列的长度,即为最少需要删除的数字个数。

  1. 定义一个长度为10的数组dp,用于记录每个数字作为末位数字时的最长接龙序列长度。
  2. 遍历输入的数列,对于每个数,将其首位数字记为a,末位数字记为b。
  3. 使用动态规划的思想,更新dp数组中对应的值。dp[b]的值应该是dp[a]+1和dp[b]的较大值。
  4. 同时,记录最大的接龙序列长度amount。
  5. 最后,输出n-amount,即最少需要删除的数的个数。

完整代码 

#include<stdio.h>
main()
{int a=0,b=0;//a为数字的首位数,b为数字的末数int n=0,amount=0;//n表示数列中数字个数,amount表示最长的接龙数列的数字个数int dp[10]={0},number=0;//dp数组用于存储对应位的最长数列长度scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&number);b=number%10;//b为末位数字while(number>=10)//a为首位数字{a=number/10;number/=10;}dp[b]=dp[a]+1>dp[b]?dp[a]+1:dp[b];//重点,详见文章重难点解答if(dp[b]>amount){amount=dp[b];}}printf("%d",n-amount);}

重难点解答

    *dp数组的具体用法

        具体来说,我们遍历输入的数字序列。dp[n]就是以数字n在某数字第一次作为末位数出现的接龙数列的长度。比如题目示例:11  121  22  12  2023中。以1结尾(这里的1为数字11末位的1)的长度为4(11 121 12 2023)、以2结尾(这里的2为数字22末位的2)的长度为2(22 2023)、以3结尾(这里的3为数字2023末位的3)的长度为1(2023)。而dp数组的作用即是存放他们对应数字的长度。如dp[1]存放的数字代表1第一次作为末位数出现的接龙数列长度。

*对于dp[b]=dp[a]+1>dp[b]?dp[a]+1:dp[b]的解释

        在这个表达式中,我们比较了两个值:dp[a] + 1dp[b]。其中,dp[a]+1表示将当前数字作为最后一个数字时的最长接龙序列长度加上1,即将当前数字接在前一个数字之后形成的新的接龙序列长度。而dp[b]表示当前数字作为末位数字时的已知的最长接龙序列长度。

        我们通过比较这两个值的大小,选择较大的值来更新dp数组中的值。如果dp[a] + 1大于dp[b],则说明将当前数字接在前一个数字之后形成的新的接龙序列长度更长,我们就将dp[b]更新为dp[a] + 1。否则,如果dp[a] + 1小于等于dp[b],则说明当前数字无法接在前一个数字之后形成更长的接龙序列,我们就保持dp[b]不变。

        通过这样的更新操作,我们可以逐步计算出每个数字作为末位数字时的最长接龙序列长度,从而得到最终的结果。

————(如有问题,欢迎评论区提问)————


http://www.ppmy.cn/news/1379715.html

相关文章

查找字符串在Text文本中的位置

public static Vector3 GetStringPositionAtText(Text text, string strFragment) {int strFragmentIndex text.text.IndexOf(strFragment); //-1表示不包含strFragmentVector3 stringPos Vector3.zero;if (strFragmentIndex > -1){Vector3 firstPos GetCharPositionAtTe…

‘ jupyter ‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

安装anaconda后&#xff0c;在 Dos黑窗口 运行 jupyter notebook 的两个问题 原因&#xff1a;没配置环境变量 解决方法&#xff1a; 在 系统环境变量Path 中 添加两个地址 这里以anaconda安装在 D:\anaconda\install 下为例 &#xff08;根据个人安装具体位置而定&#xff…

架构师面试100问?

面试架构师时&#xff0c;需要考察广泛的知识领域&#xff0c;包括技术、架构设计、团队管理、沟通能力等方面。以下是一些可能的面试问题&#xff0c;涵盖了多个方面问题&#xff1a; 介绍一下你的技术背景和经验。你在之前的项目中扮演过哪些角色&#xff1f;你对微服务架构…

go go.mod file not found in current directory or any parent directory

场景&#xff1a; 安装好 liteide 之后创建了第一个 “hello world” 的golang 项目&#xff0c;却报了如下错误。 原因分析&#xff1a; go 的环境配置问题。与 golang 的包管理有关。 解决方案&#xff1a; 如果你是 Windows 系统&#xff0c;快捷键 “WinR”&#xff0c…

uniapp引入jQuery

安装 npm install jquery --saveoryarn add jquery引入 import Vue from vue import jquery from "jquery"; Vue.prototype.$ jquery;<template><view>abc</view> </template><script>export default {data() {return {}}} </scr…

王道机试C++第 5 章 数据结构二:队列queue和21年蓝桥杯省赛选择题Day32

目录 5.2 队列 1&#xff0e;STL-queue 课上演示&#xff1a; 基本代码展示&#xff1a; 2. 队列的应用 例:约瑟夫问题 No. 2 题目描述&#xff1a; 思路提示&#xff1a; 代码展示&#xff1a; 例&#xff1a;猫狗收容所 题目描述&#xff1a; 代码表示&#xff1…

IDEA编写各种WordCount运行

目录 一、编写WordCount(Spark_scala)提交到spark高可用集群 1.项目结构 2.导入依赖 3.编写scala版的WordCount 4.maven打包 5.运行jar包 ​6.查询hdfs的输出结果 二、本地编写WordCount(Spark_scala)读取本地文件 1.项目结构 2.编写scala版的WordCount 3.编辑Edit …

软件测试 基础(2)

文章目录 1. 软件测试&软件开发生命周期2. 如何描述一个 BUG3. 如何定义 BUG 的级别4. BUG 的生命周期5. 如何进行第一次测试6. 测试的执行和 BUG 管理7. 产生争执怎么办&#xff08;处理人际关系&#xff09; 1. 软件测试&软件开发生命周期 软件测试的生命周期&#…