Dp题,dp[i][1/0][1/0][1/0]表示放到第i行时,i-1,I,i+1三个格子的状态,首尾单独处理,分情况转移下就好了
/**************************************************************
Problem: 1088
User: syh0313
Language: C++
Result: Accepted
Time:24 ms
Memory:1952 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using
namespace
std;
const
int
maxn=10010;
int
n,a[maxn];
long
long
dp[maxn][2][2][2],ans;
int
main()
{
scanf
(
"%d"
,&n);
for
(
int
i=1;i<=n;i++)
scanf
(
"%d"
,&a[i]);
for
(
int
i=1;i<=n;i++)
{
if
(i==1)
{
if
(a[i]==0) dp[i][0][0][0]=1;
if
(a[i]==1)
{dp[i][0][1][0]=1; dp[i][0][0][1]=1;}
if
(a[i]==2) dp[i][0][1][1]=1;
}
else
if
(i==n)
{
if
(a[i]==0)
{
dp[i][0][0][0]+=dp[i-1][0][0][0];
dp[i][0][0][0]+=dp[i-1][1][0][0];
}
if
(a[i]==1)
{
dp[i][1][0][0]+=dp[i-1][0][1][0];
dp[i][1][0][0]+=dp[i-1][1][1][0];
dp[i][0][1][0]+=dp[i-1][0][0][1];
dp[i][0][1][0]+=dp[i-1][1][0][1];
}
if
(a[i]==2)
{
dp[i][1][1][0]+=dp[i-1][0][1][1];
dp[i][1][1][0]+=dp[i-1][1][1][1];
}
}
else
{
if
(a[i]==0)
{
dp[i][0][0][0]+=dp[i-1][0][0][0];
dp[i][0][0][0]+=dp[i-1][1][0][0];
}
if
(a[i]==1)
{
dp[i][1][0][0]+=dp[i-1][0][1][0];
dp[i][1][0][0]+=dp[i-1][1][1][0];
dp[i][0][1][0]+=dp[i-1][0][0][1];
dp[i][0][1][0]+=dp[i-1][1][0][1];
dp[i][0][0][1]+=dp[i-1][0][0][0];
dp[i][0][0][1]+=dp[i-1][1][0][0];
}
if
(a[i]==2)
{
dp[i][1][1][0]+=dp[i-1][0][1][1];
dp[i][1][1][0]+=dp[i-1][1][1][1];
dp[i][1][0][1]+=dp[i-1][0][1][0];
dp[i][1][0][1]+=dp[i-1][1][1][0];
dp[i][0][1][1]+=dp[i-1][0][0][1];
dp[i][0][1][1]+=dp[i-1][1][0][1];
}
if
(a[i]==3)
{
dp[i][1][1][1]+=dp[i-1][0][1][1];
dp[i][1][1][1]+=dp[i-1][1][1][1];
}
}
}
for
(
int
i=0;i<=1;i++)
for
(
int
j=0;j<=1;j++) ans+=dp[n][i][j][0];
printf
(
"%lld\n"
,ans);
return
0;
}