Codeforces - Minesweeper 1D

题目链接:Codeforces - Minesweeper 1D


dp[i][0] 表示的是第 i 位为雷,第 i - 1 位和第 i + 1 位任意。(对应 s[i] == ‘*’ 的情况)
dp[i][1] 表示的是第 i 位没有雷,第 i - 1 位并且第 i + 1 位都没有雷。(对应 s[i] == ‘0’ 的情况)
dp[i][2] 表示的是第 i 位没有雷,第 i - 1 位没有雷并且 i + 1 位有雷。(对应 s[i] == ‘1’ 的情况)
dp[i][3] 表示的是第 i 位没有雷,第 i - 1 位有雷并且 i + 1 位没有雷。(对应 s[i] == ‘1’ 的情况)
dp[i][4] 表示的是第 i 位没有雷,第 i - 1 位和第 i + 1 位都有雷。(对应 s[i] == ‘2’ 的情况)


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,mod=1e9+7;
char str[N];	int dp[N][5],n;
signed main(){
	scanf("%s",str+1);	n=strlen(str+1);
	dp[0][1]=dp[0][2]=1;
	for(int i=1;i<=n;i++){
		if(str[i]=='?'){
			dp[i][0]=(dp[i-1][0]+dp[i-1][2]+dp[i-1][4])%mod;
			dp[i][1]=(dp[i-1][1]+dp[i-1][3])%mod;
			dp[i][2]=(dp[i-1][1]+dp[i-1][3])%mod;
			dp[i][3]=dp[i-1][0];
			dp[i][4]=dp[i-1][0];
		}else if(str[i]=='0'){
			dp[i][1]=(dp[i-1][1]+dp[i-1][3])%mod;
		}else if(str[i]=='1'){
			dp[i][3]=dp[i-1][0];
			dp[i][2]=(dp[i-1][1]+dp[i-1][3])%mod;
		}else if(str[i]=='2'){
			dp[i][4]=dp[i-1][0];
		}else if(str[i]=='*'){
			dp[i][0]=(dp[i-1][0]+dp[i-1][2]+dp[i-1][4])%mod;
		}
	}
	cout<<(dp[n][0]+dp[n][1]+dp[n][3])%mod;
	return 0;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104270807