码蹄集 --原题链接
解析:
BFS,每次只能前后,或者瞬移,并且每次消耗都为1,所以宽搜即可。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,a[N],ne[N];
int vis[N],res;
map<int,int>mp;
struct node{
int x,k;
};
void bfs(){
queue<node>q;
vis[1]=1;
q.push({1,0});
while(q.size()){
node t=q.front();
q.pop();
if(t.x==n){
res=t.k;
return;
}
if(t.x+1<=n&&!vis[t.x+1]){
vis[t.x+1]=1;
q.push({t.x+1,t.k+1});
}
if(t.x-1<=n&&!vis[t.x-1]){
vis[t.x-1]=1;
q.push({t.x-1,t.k+1});
}
if(ne[t.x]<=n&&!vis[ne[t.x]]){
vis[ne[t.x]]=1;
q.push({ne[t.x],t.k+1});
}
}
}
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i>0;i--){
if(mp.count(a[i])) ne[i]=mp[a[i]];
mp[a[i]]=i;
}
bfs();
cout<<res;
return 0;
}