首页 > 编程语言 >第十四届蓝桥杯省赛C++B组--接龙序列

第十四届蓝桥杯省赛C++B组--接龙序列

时间:2023-04-15 10:35:22浏览次数:47  
标签:const 数字 -- 个数 C++ 蓝桥 int 接龙 序列

接龙序列

我们称序列中\(a_i\)的首位数字恰好是\(a_{i-1}\)的末尾数字,这样的序列叫做接龙序列,比如12 23 35 57,所有长度为1的整数序列都是接龙序列,现在给定一个长度为\(n\)的序列\(a\),请你计算最少从中删除多少个数,可以使得剩下的序列是接龙序列

题解:\(DP\)

根据题目我们可以转化题意为:求出最长的接龙序列,那么答案就是\(n-\)最长接龙序列的长度

这道题显然和最长上升子序列问题比较像,所以我们按照最长上升子序列的思路走;

状态表示:\(f[i]\):以第\(i\)个数结尾的最长接龙序列的长度

状态属性:\(MAX\)

状态计算:我们只要找到前面所有末尾数字和第\(i\)个数的首位数字相同的数\(a_j\),接在它的后面即可

\[f[i] = max(f[i],f[j]+1),j<i\ \wedge r[j] = l[i] \]

​ 显然复杂度是\(O(n^2)\)的,我们考虑进行优化

状态优化:因为第\(i\)个数只能接在末尾数字\(x\)和第\(i\)个数首位数字相等的数后面,所以我们实际上可以开一个辅助 数组\(g\)来存放前\(i-1\)个数中以\(x\)结尾的\(f[j]\)的最大值,即

\[g[x] = max(g[x],f[j]),j<i,r[j]=x\\ f[i] = max(f[i],g[x]+1) \]

​ 那么复杂度被优化到了\(O(n)\)

状态初始:\(f[i] = 1\)

#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define debug(x) cerr << #x << '=' << x << endl
#define all(x) (x).begin(), (x).end()
#define rson id << 1 | 1
#define lson id << 1
#define int long long
#define mpk make_pair
#define endl '\n'
using namespace std;
typedef unsigned long long ULL;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 2e5 + 10, M = 4e5 + 10;

int n;
int g[N], f[N];
int l[N], r[N];

void solve()
{
    cin >> n;
    for (int i = 1; i <= n; ++i)
    {
        string s;
        cin >> s;
        l[i] = s[0] - '0';
        r[i] = s[s.size() - 1] - '0';
    }
    int ans = 0;
    for (int i = 1; i <= n; ++i)
    {
        f[i] = 1;
        f[i] = max(f[i], g[l[i]] + 1);
        g[r[i]] = max(g[r[i]], f[i]);
        ans = max(ans, f[i]);
    }
    cout << n - ans << endl;
}
signed main(void)
{
    Zeoy;
    int T = 1;
    // cin >> T;
    while (T--)
    {
        solve();
    }
    return 0;
}

标签:const,数字,--,个数,C++,蓝桥,int,接龙,序列
From: https://www.cnblogs.com/Zeoy-kkk/p/17320605.html

相关文章

  • 新概念2册L86笔记(复习过去时态)
    L86Outofcontrol单词理解语法理解过去时过去时态:did#仅表述事情、动作发生在过去如果事情、动作发生在过去,又需要展开细致分类wasdoing+did#给出过去具体的时间,没有做完且正在做haddone+did#给出过去的......
  • [附CIFAR10炼丹记前编] CS231N assignment 2#5 _ pytorch 学习笔记 & 解析
    pytorch环境搭建课程给你的环境当中,可以直接用pytorch,当时其默认是没有给你安装显卡支持的.如果你只用CPU来操作,那其实没什么问题,但我的电脑有N卡,就不能调用. 考虑到我已有pytorch环境(大致方法就是确认pytorch版本和对应的cuda版本安装cuda,再按照官网即可,建议自......
  • Dataguard原理
    Dataguard原理 1.DataGuard概要​OracleDataGuard是Oracle自带的数据同步功能,基本原理是将日志文件从原数据库传输到目标数据库,然后在目标数据库上应用这些日志文件,从而使目标数据库与源数据库保持同步,是一种数据库级别的高可用性方案。DataGuard可以提供Oracle数据库的......
  • vue3 父子组件共享响应式对象
    父组件<templatelang=""><div><divclass="greetings">按钮值:{{num}}</div><div><button@click="num++">按钮</button></div><div>iamparent</div&......
  • linux shell编程作业
    使用for循环语句编写一段B-shell程序,完成显示用户注册目录下的a_sub,b_sub子目录下的所有C程序文件及其目标文件的列表。dirlst="a_subb_sub"foriin$dirlstdocd$HOME/$ils-l*.cdone编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及......
  • 华为H12-811题库解析
    骨干区域内的路由器有其它所有区域的完整链路状态信息。A、对B、错试题答案:A试题解析:为了适应大型的网络,OSPF在AS内划分多个区域,每个OSPF路由器只维护所在区域的完整链路状态信息。骨干区域Area0负责区域间路由信息传播(路由信息:LSA[链路状态通告]),因此骨干区域内的路由器有其......
  • FIT5201 Complexity and Model Selection
    Assignment1,FIT5201,S120231ModelComplexityandModelSelectionInthissection,youstudytheeffectofmodelcomplexityonthetrainingandtestingerror.Youalsodemonstrateyourprogrammingskillsbydevelopingaregressionalgorithmandacross......
  • 关系型数据库基础介绍
    数据库分类数据库按照数据组织方式和存储方式可以分为不同类型,下面简单介绍几种常见的数据库类型:关系型数据库(RDBMS):这是最常用的一种数据库类型,它使用表格的形式存储数据,通过行和列来组织和管理数据。关系型数据库可以使用SQL语言进行数据操作和管理,如MySQL、Oracle、SQLServ......
  • [3]Python高级特性-【4】上下文管理器
    Python中的上下文管理器(ContextManager)是一种用于管理资源的技术,例如文件、网络连接、数据库连接等。上下文管理器使用with语句来自动获取和释放资源,确保资源的正确管理和关闭,避免资源泄漏和错误。在本教程中,我们将学习如何创建和使用上下文管理器,了解上下文管理器的原理和用途,并......
  • 原型链
    笔记软件在2023/4/1510:07:19推送该笔记原型到原型链issue2构造函数创建对象我们先使用构造函数创建一个对象:functionPerson(){}varperson=newPerson();person.name='Kevin';console.log(person.name)//Kevin在这个例子中,Person就是一个构造函数,我们使用n......