Question
Solution
做完之後看題解,發現各位大仙遞歸就完事了
然而我還在挨個判斷每種狀態
首先我們看一看題目有四種情況
然後我們開一個三維數組f[i][j][k]
f[i][j][k]表示當前位置i是否是雷(也就是j)
下一位置要不要是雷的方案數k
我們有了它就可以爲所欲爲了
判斷下一位置的狀態,看上一狀態就好了
最後我們累加方案數就行了
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 11000;
int n,g[N];
int f[N][2][2];
inline int read(){
int num=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';
return num*f;
}
int main(){
f[0][0][0]=f[0][0][1]=1;
n=read();
for(int i=1;i<=n;++i) g[i]=read();
for(int i=1;i<=n;++i){
if(g[i]==0) f[i][0][0]+=f[i-1][0][0];
if(g[i]==1){
f[i][0][1]+=f[i-1][0][0];
f[i][0][0]+=f[i-1][1][0];
f[i][1][0]+=f[i-1][0][1];
}
if(g[i]==2){
f[i][1][1]+=f[i-1][0][1];
f[i][1][0]+=f[i-1][1][1];
f[i][0][1]+=f[i-1][1][0];
}
if(g[i]==3) f[i][1][1]+=f[i-1][1][1];
}
printf("%d",f[n][0][0]+f[n][1][0]);
return 0;
}