第十四届蓝桥杯B组c/c++第五题接龙数列

动态规划   接龙数列

题意概括:给一个长度为n的数组,求使这组数为接龙数列最少的删除个数,既就是求最长的接龙长度,最后用数组长度减去最长的接龙长度。

我打眼一看感觉得用栈stack,取出首位和末位全都入栈,每次弹出栈顶,获取此时的栈顶并弹出和下一个栈顶比较。整了老半天发现不行,原来是我脑子瓦特了。虽然没有用栈解决这道问题,但是,栈和队列都是非常重要的只是,不了解的同学们可以去学习一下,下面有传送门。栈与队列知识点(我看着学的栈和队列,很不错)。

相反,它是一道动态规划类的问题。题目要求的是最少的删除个数,那咱们就可以使用动态规划求出最长的接龙数字长度,最后在用数组长度减去最长的接龙数字长度。因此,动态规划就是这道题的重点。然而状态转移方程又是动态规划的重点,因此只要我们写出状态转移方程,这道题就迎刃而解了。

让我们用原题的举例来看一下,

11    121     22    12    2023(数列)

 1 1   1 1    2 2   1 2    2 3     (首位  末位)

解题思路:我们首先建立一个数组dp[10]表示以i结尾的最长的子序列长度   (十进制数字结尾只可能是0到9,所以我们开的数组长度为10)。每次比较以末尾为dp数组下标的值与以首位为dp数组下标的值+1,并将更大的值赋给以末尾为dp数组下标的元素。

用a来表示首位,用b来表示末位,既动态转移方程就是:   dp[b]=std::max(dp[b],dp[a]+1);

由此,我们再写代码:

#include<iostream>
#include<cstring>
#include<cmath>
#define int long long 
#define endl "\n"
#define ios std::ios::sync_with_stdio(0),std::cin.tie(0),std::cout.tie(0)
int n,dp[10];
void solve()
{
	std::cin>>n;
  int ans=0;
  for(int i=0;i<n;i++)
  {
    std::string s;std::cin>>s;
    int a=s[0],b=s[s.size()-1];
    dp[b]=std::max(dp[b],dp[a]+1);
    ans=std::max(dp[b],ans);
  }
  std::cout<<n-ans<<endl;
}
signed main()
{
	ios;
	solve();
	return 0;
}

动态规划就是这样,想的多,但是写的话只有很少一部分。同时,动态规划类问题没有啥捷径,唯一的捷径就是做题做题再做题

最后,希望可以帮到大家。

  • 13
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值