跳石头

 

有 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了好几次,事实证明,不会出现玄学的错误,只是自己没注意而已。

还有我觉得要是有一个一起写题目的人,就不至于总是错在一个很奇怪的地方。首先,进度不会那么慢,其次,也不容易泄气

不过,没办法,靠强大的内心喽。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值