集合表示f(i,j)枚举到前i个数,以j为结尾,序列中最大加入多少个数
状态转移,f(i,j)每次先继承上一轮结果,只有第i个数首位等于f(i,j)的j时才能更新,所以只要相等就比较选出最大值即可!
#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<int,int> PII;
const int N=1e5+10;
int n,m,ans;
int f[N][10];
int a[N];
int fun(int x) {
while(x/10) x/=10;
return x;
}
int main() {
/*
5
11 121 22 12 2023
*/
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
for(int i=1; i<=n; i++) {
for(int j=0; j<=9; j++) {
f[i][j]=f[i-1][j];//先继承
}
f[i][a[i]%10]=max(f[i][a[i]%10],f[i-1][fun(a[i])]+1);//要么是继承的结果大,要么是把他加入新的序列结果大
}
ans=-1;
for(int i=0; i<=9; i++) {
ans=max(f[n][i],ans);
}
cout<<n-ans;
return 0;
}