解法:是一道线性dp题,。。。可惜比赛的时候没想出来,还是做题太少了。
定义f[i],表示以i数字结尾的最长接龙序列
对于一个数字,首位是a,尾部是b的数字,f[b]=max(f[b],f[a]+1);
最后找到最大的f[i],就是这个序列的最长接龙序列了, n-max 就是答案了。
#include<iostream>
using namespace std;
const int N=12;
int f[N];
//f[i] 表示 以i为结尾的最长接龙序列
//对于一个数字 a....b ,最长接龙序列=f[a]+1
int main()
{
int max1=1;
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
int a,b;
b=x%10;
while(x)
{
a=x%10;
x/=10;
}
f[b]=max(f[a]+1,f[b]);
}
for(int i=0;i<10;i++)max1=max(max1,f[i]);
cout<<n-max1<<endl;
return 0;
}