Luogu 2327 扫雷
题目链接:https://www.luogu.org/problem/P2327
思路:
设$f[i][j][k][l]$,$i$表示第$i$列,$j,k,l$取值为$0$或$1$,表示第$i-1$,$i$,$i+1$位是否有雷。
要初始化$1$号位的情况,输出时也要考虑$n$号位的答案。
简单易懂但是写起来繁琐的转移即可。
代码:
#include <bits/stdc++.h> const int MAXN = 10050; using namespace std; int n, a[MAXN], f[MAXN][2][2][2]; int main() { cin >> n; for(int i = 1 ; i <= n; i++) cin >> a[i]; if(a[1] == 0) f[1][0][0][0] = 1; else if(a[1] == 1) { f[1][0][1][0] = 1; f[1][0][0][1] = 1; } else 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]; else 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]; } else if(a[i] == 2) { f[i][1][1][0] += f[i - 1][0][1][1] + f[i - 1][1][1][1]; f[i][1][0][1] += f[i - 1][0][1][0] + f[i - 1][1][1][0]; f[i][0][1][1] += f[i - 1][0][0][1] + f[i - 1][1][0][1]; } else f[i][1][1][1] += f[i - 1][0][1][1] + f[i - 1][1][1][1]; } if(a[n] == 0) cout << f[n][0][0][0] << endl; else if(a[n] == 1) cout << f[n][1][0][0] + f[n][0][1][0] << endl; else if(a[n] == 2) cout << f[n][1][1][0] << endl; return 0; }