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

京公网安备 11010502036488号