题目:http://codeforces.com/contest/1418/problem/C
题意:我和朋友打Boss,一共有1~n关,每层有一个Boss(Boss有两种0和1),朋友实力弱只能打死为0的Boss,为1的Boss只能跳过,两种Boss我都能打过;打怪规则是朋友先打只能打死1或2只怪,打不过跳过,然后再由我打同样只能打1或两只怪,就这样轮着打(不能不打),问最后通关朋友使用的最小跳过数。
思路:使用dp[所在层i][who]二维数组,它的值为在第i层朋友所使用的跳跃数目
#include<bits/stdc++.h>
const int inf=0x3f3f3f3f;
int T;
const int maxn=2e5+5;
int a[maxn];
int dp[maxn][2];//1代表我,0代表朋友 dp[所在层i][who]它表示为在第i层朋友所使用的跳跃数目
int main(){
cin>>T;
while(T--){
int n; cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dp[1][1]=inf;
dp[1][0]=a[1];
dp[2][0]=a[1]+a[2];
dp[2][1]=dp[1][0];
for(int i=3;i<=n;i++){
dp[i][1]=min(dp[i-1][0],dp[i-2][0]);//从上一层或上上层朋友的手中接过
dp[i][0]=min(dp[i-1][1]+a[i],dp[i-2][1]+a[i-1]+a[i]);//从上一层或上上层我的手中接过
}
cout<<min(dp[n][1],dp[n][0])<<endl;
}
}