题目链接: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; }