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

目录

题目链接

题目理解

解题思路

完整代码 

重难点解答

*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]不变。

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

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

  • 40
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
单词接龙是一种游戏,玩家需要在给定的单词列表中,按照首尾字母匹配的顺序依次连接单词,直到无法继续连接为止。在C语言中,我们可以通过使用字符串和循环等基本概念来实现单词接龙。 首先,我们需要定义一个单词列表,可以使用字符数组或字符串数组来存储。例如,可以使用以下代码定义一个含有5个单词的字符串数组: ```c char words[5][10] = { "apple", "elephant", "tent", "tiger", "rat" }; ``` 然后,我们可以编写一个函数来实现单词接龙的逻辑。该函数将接受一个单词列表作为参数,并依次连接匹配的单词。 ```c #include <stdio.h> #include <string.h> void wordChain(char words[][10], int numWords) { char currentWord[10]; int i, j; int chainLength = 0; // 接龙长度 // 遍历单词列表 for (i = 0; i < numWords; i++) { strcpy(currentWord, words[i]); // 复制当前单词作为接龙的起点 chainLength = 1; // 接龙长度初始化为1 // 在单词列表中搜索下一个匹配的单词 for (j = 0; j < numWords; j++) { // 单词的首字母和之前的单词的尾字母相同,且未被使用过 if (currentWord[strlen(currentWord) - 1] == words[j][0] && strcmp(currentWord, words[j]) != 0) { printf("%s -> ", currentWord); strcpy(currentWord, words[j]); chainLength++; // 接龙长度增加 if (chainLength == numWords) { // 如果接龙长度等于单词总数,则接龙完成 printf("%s\n", currentWord); return; } j = -1; // 从头开始搜索下一个匹配的单词 } } } // 无法继续接龙 printf("无法接成龙!\n"); } int main() { char words[5][10] = { "apple", "elephant", "tent", "tiger", "rat" }; wordChain(words, 5); return 0; } ``` 上述代码中,我们定义了一个`wordChain`函数来实现单词接龙逻辑。该函数遍历单词列表,并通过比较首尾字母来匹配单词。如果找到匹配的单词,则将其设置为当前单词,继续搜索下一个匹配的单词。如果接龙完成(接龙长度等于单词总数),则输出接龙结果;如果无法继续接龙,则输出提示。 在`main`函数中,我们定义了一个字符串数组`words`,并调用`wordChain`函数来进行单词接龙。最终程序将输出如下结果: ``` apple -> elephant -> tent -> tiger -> rat ``` 这就是一个基于C语言实现的简单单词接龙游戏。实际上,我们可以根据需求进行更复杂的单词接龙逻辑设计,增加限制条件或规则,使游戏更加有趣和挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bit_Le

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值