題目傳送門c++
作完以後看題解,發現各位大仙遞歸就完事了
然而我還在挨個判斷每種狀態
首先咱們看一看題目有四種狀況
而後咱們開一個三維數組f[i][j][k]
f[i][j][k]表示當前位置i是不是雷(也就是j)
下一位置要不要是雷的方案數k
咱們有了它就能夠隨心所欲了
判斷下一位置的狀態,看上一狀態就行了
最後咱們累加方案數就好了git
#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; }