题意:就是挖地雷,给你一个字符串,‘*’代表地雷,‘1’代表在它的周围有1个地雷,‘2’代表在左右都有个地雷,‘?’代表不确定是不是地雷,可以是1,2,*,问你最后有几种方式确定所有的的地雷。
思路:dp[i][0] 代表次位置为0,dp[i][1]代表左边有地雷,dp[i][2]代表右边有地雷,dp[i][3]代表左右都有,dp[i][4]代表此位置为地雷。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 1000100 5 #define ll long long 6 using namespace std; 7 const int mod=1000000007; 8 9 char str[maxn]; 10 ll dp[maxn][5]; 11 12 int main() 13 { 14 while(scanf("%s",str)!=EOF) 15 { 16 int k=strlen(str); 17 memset(dp,0,sizeof(dp)); 18 if(str[0]=='0') dp[0][0]=1; 19 else if(str[0]=='1') dp[0][2]=1; 20 else if(str[0]=='*') dp[0][4]=1; 21 else if(str[0]=='?') 22 { 23 dp[0][0]=dp[0][2]=dp[0][4]=1; 24 } 25 for(int i=1; i<k; i++) 26 { 27 if(str[i]=='0') 28 { 29 dp[i][0]+=(dp[i-1][1]+dp[i-1][0]); 30 dp[i][0]%=mod; 31 } 32 else if(str[i]=='1') 33 { 34 dp[i][1]+=dp[i-1][4]; 35 dp[i][2]+=dp[i-1][0]+dp[i-1][1]; 36 dp[i][1]%=mod; 37 dp[i][2]%=mod; 38 } 39 else if(str[i]=='2') 40 { 41 dp[i][3]+=dp[i-1][4]; 42 dp[i][3]%=mod; 43 } 44 else if(str[i]=='*') 45 { 46 dp[i][4]+=dp[i-1][2]+dp[i-1][3]+dp[i-1][4]; 47 dp[i][4]%=mod; 48 } 49 else if(str[i]=='?') 50 { 51 dp[i][0]+=dp[i-1][0]+dp[i-1][1]; 52 dp[i][0]%=mod; 53 dp[i][1]+=dp[i-1][4]; 54 dp[i][1]%=mod; 55 dp[i][2]+=dp[i-1][1]+dp[i-1][0]; 56 dp[i][2]%=mod; 57 dp[i][3]+=dp[i-1][4]; 58 dp[i][3]%=mod; 59 dp[i][4]+=dp[i-1][2]+dp[i-1][3]+dp[i-1][4]; 60 dp[i][4]%=mod; 61 } 62 } 63 ll ans=dp[k-1][0]+dp[k-1][1]+dp[k-1][4]; 64 ans%=mod; 65 printf("%lld ",ans); 66 } 67 return 0; 68 }