解决了,顺便提供一组样例,
```
4
1 1 1 1
````
输出
```
1
```
代码
```
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cmath>
#include<cstring>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
using namespace std;
inline int read()
{
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return f*x;
}
int n,a[10100];
int dp[10100][2][2];
void dfs(int x)
{
if(a[x-1]==0)
{
if(a[x]==0)
{
dp[x][0][0]=dp[x-1][0][0];
}
else if(a[x]==1)
{
dp[x][0][0]=dp[x-1][0][0];
}
else
{
printf("0");
exit(0);
}
}
if(a[x-1]==1&&a[x]==1)
{
dp[x][0][1]=dp[x-1][0][0];
dp[x][1][0]=dp[x-1][0][1];
dp[x][0][0]=dp[x-1][1][0];//修改
}
else if(a[x-1]==1)
{
if(a[x]==3)
{
printf("0");
exit(0);
}
if(a[x]==2)
{
dp[x][0][1]=dp[x-1][0][0];
dp[x][1][0]=dp[x-1][0][1];
}
if(a[x]==0)
{
dp[x][0][0]=dp[x-1][1][0];
}
}
else if(a[x-1]==2)
{
if(a[x]==0)
{
printf("0");
exit(0);
}
if(a[x]==1)
{
dp[x][1][0]=dp[x-1][1][1];
dp[x][0][1]=dp[x-1][1][0];
}
if(a[x]==2)
{
dp[x][1][1]=dp[x-1][0][1];
dp[x][1][0]=dp[x-1][1][1];
dp[x][0][1]=dp[x-1][1][0];
}
else if(a[x]==3)
{
dp[x][1][1]=dp[x-1][0][1];
}
}
else if(a[x-1]==3)
{
if(a[x]==0)
{
printf("0");
exit(0);
}
if(a[x]==1)
{
printf("0");
exit(0);
}
else
{
dp[x][1][1]=dp[x-1][1][1];
}
}
}
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
}
if(a[1]==3||a[n]==3)
{
printf("0");
return 0;
}
if(a[1]==1)
{
dp[1][0][1]=1;
dp[1][0][0]=1;
}
else if(a[1]==0)
{
dp[1][0][0]=1;
}
else if(a[1]==2)
{
dp[1][0][1]=1;
}
for(int i=2;i<=n;i++)
{
dfs(i);
}
/* for(int i=1;i<=n;i++)
{
printf("%d %d %d %d\n",dp[i][0][0],dp[i][1][0],dp[i][0][1],dp[i][1][1]);
}*/
if(a[n]==1)
{
printf("%d",dp[n][1][0]+dp[n][0][1]);
}
else if(a[n]==2)
{
printf("%d",dp[n][1][1]);
}
else if(a[n]==0)
{
printf("%d",dp[n][0][0]);
}
}
```
by sunxiaofan @ 2019-10-05 11:01:35
orz
by jack070906 @ 2020-03-29 18:12:51