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 }