codeforces Minesweeper 1D

题意:就是挖地雷,给你一个字符串,‘*’代表地雷,‘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\n",ans);

66    }

67    return 0;

68 }
View Code

 

你可能感兴趣的:(codeforces)