题目链接:https://ac.nowcoder.com/acm/problem/20241
题目大意:
图片说明
思路:f[i][0/1][0/1][0/1]:表示i-1, i, i+1放不放雷的方案数。其实只要记录i和i+1就可以了。因为i-1可以从上一个转移状态的i得到。
初始化:

#include <bits/stdc++.h>
#define LL long long
using namespace std;

int a[10005];
LL f[10005][2][2][2];
int main(){
    int n; scanf("%d", &n);
    for(int i=1; i<=n; i++){
        scanf("%d", &a[i]);
    }
    if(a[1]==0){
        f[1][0][0][0]=1;
    }
    if(a[1]==1){
        f[1][0][1][0]=f[1][0][0][1]=1;
    }
    if(a[1]==2){
        f[1][0][1][1]=1;
    }

    for(int i=2; i<=n; i++){
        if(a[i]==0){
            f[i][0][0][0]=f[i-1][0][0][0]+f[i-1][1][0][0];
        }
        if(a[i]==1){
            f[i][1][0][0]=f[i-1][0][1][0]+f[i-1][1][1][0];
            f[i][0][1][0]=f[i-1][0][0][1]+f[i-1][1][0][1];
            f[i][0][0][1]=f[i-1][0][0][0]+f[i-1][1][0][0];
        }
        if(a[i]==2){
            f[i][1][1][0]=f[i-1][0][1][1]+f[i-1][1][1][1];
            f[i][0][1][1]=f[i-1][0][0][1]+f[i-1][1][0][1];
            f[i][1][0][1]=f[i-1][0][1][0]+f[i-1][1][1][0];
        }
        if(a[i]==3){
            f[i][1][1][1]=f[i-1][0][1][1]+f[i-1][1][1][1];
        }
    }
    LL ans=f[n][0][0][0]+f[n][0][1][0]+f[n][1][0][0]+f[n][1][1][0];
    printf("%lld\n", ans);

    return 0;
}