题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1088
答案貌似只会是1,2,0中的一个
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
#include <cassert>
#include <set>
#include <map>
#include <cmath>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define clr(a,x) memset(a,(x),sizeof(a));
#define eps 1e-8
#define LL long long
#define mp make_pair
const int inf=1e8;
const int maxn=10000+5;
int a[maxn];
LL dp[2][4];
int n;
int main()
{
while(scanf("%d",&n)==1) {
rep(i,1,n+1) scanf("%d",a+i);
clr(dp,0); int p=1,q=0;
if(a[1]==0) dp[q][0]=1;
else if(a[1]==1) dp[q][1]=dp[q][2]=1;
else if(a[1]==2) dp[q][3]=1;
rep(i,2,n) {
clr(dp[p],0);
if(a[i]==1) {
dp[p][0] += dp[q][1];
dp[p][1] += dp[q][2];
dp[p][2] += dp[q][0];
} else if(a[i]==2) {
dp[p][1] += dp[q][3];
dp[p][2] += dp[q][1];
dp[p][3] += dp[q][2];
} else if(a[i]==3) {
dp[p][3] += dp[q][3];
} else if(a[i]==0) {
dp[p][0] += dp[q][0];
}
p ^= 1; q ^= 1;
}
LL ans=0;
if(a[n]==0) ans += dp[q][0];
else if(a[n]==1) ans += dp[q][1]+dp[q][2];
else if(a[n]==2) ans += dp[q][3];
printf("%lld\n",ans);
}
}