有 n 个石头从左到右拍成一排,第 i 个石头的颜色为 ci 。现在小 Ho 在第一个石头,他想跳到第 n 个石头,每一步有两种跳跃方式:
1. 从第 i 个石头跳到第 i+1 个石头
2. 跳到右边第一个和当前石头颜色相同的石头(如果存在的话)
现在他想知道,从第一个石头跳到第 n 个石头至少需要几步跳跃
Input
第一行一个正整数 n
第二行 n 个正整数,表示ci
1 ≤ n, ci ≤ 2 × 105
Output
输出至少需要几步跳跃
Sample Input
6 1 2 1 3 4 2
Sample Output
2
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,n) for(int i=l;i<=n;i++)
#define per(i,l,n) for(int i=n;i>=l;i--)
int a[200020];
int last[200020];
int pre[200020];
int dp[200020];
int main(){
int n;
cin>>n;
rep(i,1,n){
cin>>a[i];
last[a[i]]=-1;
}
rep(i,1,n){
pre[i]=last[a[i]];
last[a[i]]=i;
}
rep(i,2,n){
if(pre[i]!=-1){
dp[i]=min(dp[i-1]+1,dp[pre[i]]+1);
}
else dp[i]=dp[i-1]+1;
}
cout<<dp[n]<<endl;
//rep(i,1,n) cout<<dp[i]<<endl;
return 0;
}
由于右边第一个,我以为是从右数第一个,而不是右边的第一个,导致对自身的怀疑。原来还有一种可能,就是理解错了题意。
至于根据值的相同,来标记最近的,写多了就会了吧。
Wa了好几次,事实证明,不会出现玄学的错误,只是自己没注意而已。
还有我觉得要是有一个一起写题目的人,就不至于总是错在一个很奇怪的地方。首先,进度不会那么慢,其次,也不容易泄气
不过,没办法,靠强大的内心喽。