蓝桥23省赛——接龙数列
算法:dp + 优化
可以发现类似于最长上升子序列问题,因此分析方法也是一样的,但是不同于最长上升子序列的区别是这题只会用到每个数的最高位和最低位,因此使用g[i] 存储以i结尾的数当前的接龙子数列长度,就可以省去一维循环。还有一个存储的技巧是使用l[i] 和 r[i] 存储每个数的最高位和最低位,就可以省去计算最高位的麻烦
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 100010;
int l[N], r[N];
int f[N], g[10];
int n;
int main()
{
scanf("%d", &n);
char num[20];
for(int i = 0;i < n;i ++ )
{
cin >> num;
l[i] = num[0] - '0', r[i] = num[strlen(num) - 1] - '0';//存储每个数的最高位最低位
}
for(int i = 0;i < n;i ++ )
{
f[i] = 1;
f[i] = max(f[i], g[l[i]] + 1);//以l[i]结尾的数的当前接龙数列长度
g[r[i]] = max(g[r[i]], f[i]);//当前数最低位为r[i], g[r[i]] 更新
}
int res = 0;
for(int i = 0;i < n;i ++ ) res = max(res, f[i]);
cout << n - res << endl;
return 0;
}