题意
这道题的题意我感觉还是挺不好理解的
意思就是说现在给你一个悬崖,每个样例中第二行输入的数代表这个悬崖突出的部分,你刚好站着这个悬崖的最高层,现在你可以进行如下操作:将本突起位置隐藏,(这样你就掉下去了)但是做出的代价就是让这个位置的紧挨着的下一个位置的状态发生改变(如果你改变了x位置的突出情况,如果x-1位置是突出的,那么它将变成隐藏的,反之就会变成突出的)但是现在有一个问题就是你是绝对不能允许你往下掉两个单位,因为你是bym同学,那样会影响到你的发型,(这样就无法吸引别人追求你),当然你可以召唤一次山神,来随意改变一个位置的状态,当然你也不希望总是召唤他,请输出你召唤山神的最少次数
思路
第一次看到这个题的时候,我是一脸问号的,不知道这道题在说什么,我真是太菜了。
现在来分析一下,
- 假如这个悬崖凸起部分是100 1
那么这个和2 1是等价的,因为按照性质,我每次隐藏一个部分,那么它底下的那个位置就会被突出,这样一直往下就和2是等价的。 - 假如这个悬崖凸起部分是100 5
那么它虽然和 6 5是等价的,但是你隐藏6的时候,5也跟着被隐藏了,那么bym同学一定会从6的位置掉到地面,这样就影响了他的发型,所以我们应该在这里召唤一次山神,让5的位置保持不动,在我隐藏了6的位置以后,5的位置依旧突起,这样就能让bym不搞乱他的发型的前提下顺利到达地面。
那么现在就可以愉快的dp了
分析状态
如果说
a
[
i
−
1
]
−
a
[
i
−
2
]
=
=
1
a[i-1]-a[i-2]==1
a[i−1]−a[i−2]==1(底下俩是连在一起的,但是bym在上面更高的位置上,因此隐藏了bym的位置只会让i-1的位置也一起隐藏)
因此
d
p
[
i
]
=
d
p
[
i
−
2
]
dp[i]=dp[i-2]
dp[i]=dp[i−2]
如果说
a
[
i
−
1
]
−
a
[
i
−
2
]
!
=
1
a[i-1]-a[i-2]!=1
a[i−1]−a[i−2]!=1那么bym的到达i的位置后,我隐藏了i和i-1,那么他直接掉在i-2的位置上,这样他的发型就不保,因此只能召唤一次山神
d
p
[
i
]
=
d
p
[
i
−
1
]
+
1
dp[i]=dp[i-1]+1
dp[i]=dp[i−1]+1
#include<iostream>
#include<cstring>
using namespace std;
int dp[2102100];
int a[2102101];
int main(){
int T;
cin>>T;
while(T--){
int t,n;
cin>>t>>n;
for(int i=n;i;i--)cin>>a[i];
for(int i=2;i<=n;i++){
if(a[i-1]-a[i-2]==1)dp[i]=dp[i-2];
else dp[i]=dp[i-1]+1;
}
cout<<dp[n]<<endl;
}
}