YYHS-NOIP模拟赛-mine
题解
这道题不难想到用dp来做
dp[i][0]表示第i个格子放0
dp[i][1]表示第i个格子放1且第i-1个格子放雷
dp[i][2]表示第i个格子放2
dp[i][3]表示第i个格子放1且第i+1个格子放雷
dp[i][4]表示第i个格子放雷
然后就是转移了
不难发现
上一层的0,1能推到这一层的0
上一层的4推到1
上一层的4推到2
0,1推到3
2,3,4推到4
如果当前格子是?,那么上面的情况就需要都考虑
最后是初始化
我们可以发现第0层只能放0和3,其他是不能放的
1 #include<bits/stdc++.h> 2 #define L 1000005 3 #define ll long long 4 #define mod 1000000007 5 using namespace std; 6 int len; 7 ll dp[L][5]; 8 char s[L]; 9 int main(){ 10 scanf("%s",s+1); 11 len=strlen(s+1); 12 dp[0][0]=dp[0][3]=1; 13 for (int i=1;i<=len;i++){ 14 if (s[i]=='0'||s[i]=='?') dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod; 15 if (s[i]=='1'||s[i]=='?') dp[i][1]=dp[i-1][4],dp[i][3]=(dp[i-1][0]+dp[i-1][1])%mod; 16 if (s[i]=='2'||s[i]=='?') dp[i][2]=dp[i-1][4]; 17 if (s[i]=='*'||s[i]=='?') dp[i][4]=(dp[i-1][2]+dp[i-1][3]+dp[i-1][4])%mod; 18 if (s[i]=='0') dp[i][1]=dp[i][2]=dp[i][3]=dp[i][4]=0; 19 if (s[i]=='1') dp[i][0]=dp[i][2]=dp[i][4]=0; 20 if (s[i]=='2') dp[i][0]=dp[i][1]=dp[i][3]=dp[i][4]=0; 21 if (s[i]=='*') dp[i][0]=dp[i][1]=dp[i][2]=dp[i][3]=0; 22 } 23 printf("%lld\n",(dp[len][0]+dp[len][1]+dp[len][4])%mod); 24 return 0; 25 }