CF #179 div2 B

2014-10-29 23:02:43

不错的一道DP,练练思维。

 1 /*************************************************************************
 2     > File Name: b.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Wed 29 Oct 2014 12:35:58 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 const int mod = 1000000007;
27 
28 int n;
29 ll dp[100010][4];
30 char s1[100010];
31 char s2[100010];
32 
33 int main(){
34     scanf("%d",&n);
35     scanf("%s%s",s1 + 1,s2 + 1);
36     memset(dp,0,sizeof(dp));
37     dp[0][0] = 1;
38     dp[0][1] = 0; // <
39     dp[0][2] = 0; // >
40     dp[0][3] = 0; // < and >
41     for(int i = 1; i <= n; ++i){
42         if(s1[i] == '?' && s2[i] == '?'){
43             dp[i][0] = dp[i - 1][0] * 10;
44             dp[i][1] = dp[i - 1][0] * 45 + dp[i - 1][1] * 55;
45             dp[i][2] = dp[i - 1][0] * 45 + dp[i - 1][2] * 55;
46             dp[i][3] = dp[i - 1][1] * 45 + dp[i - 1][2] * 45 + dp[i - 1][3] * 100;            
47         }
48         else if(s1[i] == '?' && s2[i] != '?'){
49             ll v = s2[i] - '0';
50             dp[i][0] = dp[i - 1][0];
51             dp[i][1] = dp[i - 1][0] * v + dp[i - 1][1] * (v + 1);
52             dp[i][2] = dp[i - 1][0] * (9 - v) + dp[i - 1][2] * (10 - v);
53             dp[i][3] = dp[i - 1][1] * (9 - v) + dp[i - 1][2] * v + dp[i - 1][3] * 10;
54         }
55         else if(s1[i] != '?' && s2[i] == '?'){
56             ll v = s1[i] - '0';
57             dp[i][0] = dp[i - 1][0];
58             dp[i][1] = dp[i - 1][0] * (9 - v) + dp[i - 1][1] * (10 - v);
59             dp[i][2] = dp[i - 1][0] * v + dp[i - 1][2] * (v + 1);
60             dp[i][3] = dp[i - 1][1] * v + dp[i - 1][2] * (9 - v) + dp[i - 1][3] * 10;
61         }
62         else{
63             ll v1 = s1[i] - '0';
64             ll v2 = s2[i] - '0';
65             if(v1 < v2){
66                 dp[i][1] = dp[i - 1][1] + dp[i - 1][0];
67                 dp[i][2] = 0;
68                 dp[i][3] = dp[i - 1][2] + dp[i - 1][3];
69             }
70             else if(v1 > v2){
71                 dp[i][1] = 0;
72                 dp[i][2] = dp[i - 1][2] + dp[i - 1][0];
73                 dp[i][3] = dp[i - 1][1] + dp[i - 1][3];
74             }
75             else{
76                 dp[i][0] = dp[i - 1][0];
77                 dp[i][1] = dp[i - 1][1];
78                 dp[i][2] = dp[i - 1][2];
79                 dp[i][3] = dp[i - 1][3];
80             }
81         }
82         dp[i][1] %= mod;
83         dp[i][2] %= mod;
84         dp[i][3] %= mod;
85     }
86     printf("%I64d\n",dp[n][3]);
87     return 0;
88 }

 

posted @ 2014-10-29 23:03  Naturain  阅读(131)  评论(0编辑  收藏  举报