首页 > 其他分享 >接龙数列

接龙数列

时间:2024-03-23 20:01:15浏览次数:32  
标签:ch 题目 数列 简析 接龙 dp

@

目录

一、题目描述

P9242 [蓝桥杯 2023 省 B] 接龙数列

二、算法简析

核心思想:动态规划

题目要我们求删除数的最小个数。可以转变问题,求能形成的接龙数列的最大长度 \(MaxLength\),\(n - MaxLength\) 即为所求。
由题意可知,我们只需要关注每个数的首、末位数字。规定,\(A[i]\) 表示下标为 \(i\) 的数,\(A[i].l\) 和 \(A[i].r\) 分别表示 \(A[i]\) 的首、末位数字。
令 \(dp[i + 1][j]=\) 前 \(i + 1\) 个数以 \(j\) 结尾的接龙数列的最大长度。有两种情况:

  • 1、若 \(A[i].r \neq j\),则 \(A[i]\) 不能加入数列,即 \(dp[i + 1][j] = dp[i][j]\)。
  • 2、若\(A[i].r == j\),则 \(A[i]\) 可以加入或不加入数列,即 \(dp[i + 1][j] = max(dp[i][j], dp[i][A[i].l])\)。

我们可以压缩至一维数组:

\[dp[A[i].l]=max(dp[A[i].l], dp[A[i].r] + 1) \]


三、本题代码

#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> P;

int n, dp[10];
vector<P> A;

P quickin(void)
{
	P ret;
	bool flag = true;
	char ch = getchar();
	while (ch < '0' || ch > '9')
		ch = getchar();
	while ('0' <= ch && ch <= '9')
	{
		if (flag)
		{
			ret.first = ret.second = ch - '0';
			flag = false;
		}
		else
			ret.second = ch - '0';
		ch = getchar();
	}
	return ret;
}

int solve(void)
{
	for (int i = 0; i < n; i++)
	{
		dp[A[i].second] = max(dp[A[i].second], dp[A[i].first] + 1);
	}
	int ans = 0;
	for (int i = 0; i < 10; i++)
		ans = max(ans, dp[i]);
	return ans;
} 

int main()
{
	#ifdef LOCAL
	freopen("test.in", "r", stdin);
	#endif
	
	cin >> n;
	for (int i = 0; i < n; i++)
		A.push_back(quickin());
	
	cout << n - solve() << endl;
	
	return 0;
} 

标签:ch,题目,数列,简析,接龙,dp
From: https://www.cnblogs.com/hoyd/p/18091593

相关文章

  • 图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙
    目录417.太平洋大西洋水流问题827.最大人工岛127.单词接龙417.太平洋大西洋水流问题题目链接(opensnewwindow)有一个m×n的矩形岛屿,与太平洋和大西洋相邻。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。这个岛被分割......
  • 泰波纳契数列
    实现泰波纳契数列的时候,用寻常的写法效率很低,classSolution:deftribonacci(self,n:int)->int:dp=[0foriinrange(n+1)]iflen(dp)==1:return0eliflen(dp)==2orlen(dp)==3:return1else......
  • 波动数列
    一、题目描述P8614[蓝桥杯2014省A]波动数列二、问题简析设第一个数为\(x_0\),\(d_i=a~or~-b\),则长度为\(n\)的数列的和为:\[\begin{split}s&=x_0+x_1+x_2+...+x_{n-1}\\&=(x_0+0)+(x_0+d_1)+(x_0+d_1+d_2)+...+(x_0+d_1+...+d_{n-1})\\&=n*x_0+0+(n-1)*d_1+(n-......
  • 详细解释可变参数列表C语言
    目录考研复习-函数栈帧(详解)一.什么是可变参数列表?1.1 求两个数据中的最大值1.2求多个数据中的最大值1.3逐步分析 1.va_start 2.va_arg3.va_end 4._INTSIZEOF(t)第一步理解:4的倍数第二步理解:最小4字节对齐数                第三步理解:理解源代......
  • (斐波那契数列),假如兔子都不死,问到第12个月时一共有多少只兔子 //(有一对兔子,从出生后第
    //斐波那契数列,计算兔子的数量:11235813......从第三个数开始,//后一个数都是前两个数的和,假如兔子都不死,问到第12个月时一共有多少只兔子//(有一对兔子,从出生后第三个月开始,每一个月生一对兔子,小兔子同理)publicclassRabitDemo1{//斐波那契数列,计算兔子的数量:1......
  • 有趣的数列
    一个比较正常,自然的思路:看这篇题解像这种全排列的问题,一个很正常的想法就是从小到大进行依次放置,再看一下每次放置的限制是什么我自己想的时候,是直接先把所有奇数位的数字取出来,那么显然取了\(n\)个数,剩下的\(n\)个数肯定是偶数位的,而且由题意,他们只存在唯一的一种摆法(即从小到......
  • 龙行龘龘,成语接龙,祝您龙年大吉
    先祝大家新的一年:龙行龘龘,前程朤朤!龙年当然要玩成语接龙啦!这是龙的传承与创新(话说龙辰辰真的好可爱哇)成语接龙游戏规则:必须是成语;除了第一个,后面每次接龙的成语必须是前一个成语的最后一个字相同的拼音。管你听没听懂,玩就完了!1.龙年主题界面共有五个功能,设计的功能......
  • 数学分析复习:数列和级数收敛
    数学分析复习:数列和级数收敛1.实数列收敛的定义2.实数项级数收敛的定义3.单调有界实数列必收敛4.Bolzano-Weierstrass定理5.Cauchy列5.1Cauchy列的性质5.2实数列的Cauchy收敛准则5.3实数项级数的Cauchy收敛准则6.Euler常数e的构造7.判断实数列和实数项级数收......
  • abc234E 不小于X的数位构成等差数列的最小数字
    给定X,求不小于X的整数,满足各个数位正好构成等差数列。1<=X<=1E17直接枚举首项和公差,找出所有可行的解,取最优值即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;i++)#defineper(i,a,b)for(inti=b;i>=a;......
  • 线段树维护区间等差数列
    线段树维护区间等差数列我们采用用两个懒标记分别维护等差数列首项k和公差d维护时有个细节是假如我有左右两个区间需要合并信息时我们对于左边还是k和d但是对于右边信息此时k应该变成k+len*d,公差还是dlen表示的是右边区间长度牛牛的等差数列#include......