Luogu P2327 [SCOI2005]扫雷

题目传送门

思路

这道题是一道典型的 DP 题。
状态:fi,j,k (0in,0j,k1) 表示前 i+1 个格子中,第 i 个雷的情况为 j ,第 i+1 个雷的情况为 k
那状态转移方程呢?
原先的数组直接设成 a1,a2,...,an 好了,
真实的雷的情况设成 r1,r2,...,rn
考虑连续三个数 ri1+ri+ri+1=ai
ai=0 时:

  • ri1=0,ri=0,ri+1=0

ai=1 时:

  • ri1=0,ri=0,ri+1=1
  • ri1=0,ri=1,ri+1=0
  • ri1=1,ri=0,ri+1=0

ai=2 时:

  • ri1=0,ri=1,ri+1=1
  • ri1=1,ri=0,ri+1=1
  • ri1=1,ri=1,ri+1=0

ai=3 时:

  • ri1=1,ri=1,ri+1=1

这样,就可以很轻松的写出状态转移方程来了。

代码

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

int f[10005][2][2];
int a[10005];

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	f[0][0][0] = f[0][0][1] = 1;
	for (int i = 1; i <= n; i++) {
		if (a[i] == 0) {
			f[i][0][0] += f[i - 1][0][0];
		}
		if (a[i] == 1) {
			f[i][0][0] += f[i - 1][1][0];
			f[i][1][0] += f[i - 1][0][1];
			f[i][0][1] += f[i - 1][0][0];
		}
		if (a[i] == 2) {
			f[i][0][1] += f[i - 1][1][0];
			f[i][1][0] += f[i - 1][1][1];
			f[i][1][1] += f[i - 1][0][1];
		}
		if (a[i] == 3) {
			f[i][1][1] += f[i - 1][1][1];
		}
	}
	printf("%d", f[n][0][0] + f[n][1][0]);
	return 0;
}
posted @   A-Problem-Solver  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示