题目链接:http://codeforces.com/problemset/problem/476/B
题目意思:给出两个字符串str1, str2,其中,str1 只由 '+' 和 '-' 组成,而str2 由 '+','-'和'?'组成。初始点在原点0的位置,经过 str1 的变换最终会达到某一个位置,‘+'表示向右移动一个单位(+1),'-'即-1。str2 中 '?'的部分可以填入'+','-'其中一个符号。问能填充 '?' 的所有情况中,使得使用 str2 所有的操作,能到达 经过 str1 所有操作后到达的最终位置 的概率是多少。(额....比较拗口= =,俺的...表达能力果然不敢恭维- -!)
首先,算出经过 str1 所有的操作后最终到达的位置,这个明显是确定的啦,没有 '?' 嘛。接着算出 str2 除 '?' 外到达的位置,剩下用深搜来填入 '?',统计等于最终位置的种数。最后用 这个种数 / 问号能填入的所有情况,就是答案啦!!!
还有一些特判点,假如str2 没有问号,概率只有两种情况:1 或者 0。其他就要dfs算啦~~
粗心过头,wa了两次: 无用%.12lf(又到考眼力的时候了= =) 还有调试 cnt 不记得注释了= =......
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 10 + 5; 9 char str1[maxn], str2[maxn]; 10 int unknown, origin; 11 double cnt, fenmu; 12 13 void dfs(int c, int cur) 14 { 15 if (c == unknown) 16 { 17 if (cur == origin) 18 cnt++; 19 return; 20 } 21 dfs(c+1, cur+1); 22 dfs(c+1, cur-1); 23 } 24 25 int main() 26 { 27 #ifndef ONLINE_JUDGE 28 freopen("input.txt", "r", stdin); 29 #endif 30 31 while (scanf("%s%s", str1, str2) != EOF) 32 { 33 int len = strlen(str1); 34 origin = 0; 35 36 for (int i = 0; i < len; i++) 37 { 38 if (str1[i] == '+') 39 origin += 1; 40 else 41 origin -= 1; 42 } 43 44 int known = 0; 45 unknown = 0; 46 for (int i = 0; i < len; i++) 47 { 48 if (str2[i] == '?') 49 unknown++; 50 else if (str2[i] == '+') 51 known += 1; 52 else if (str2[i] == '-') 53 known -= 1; 54 } 55 if (!unknown) 56 { 57 if (known != origin) 58 printf("0.000000000000 "); 59 else 60 printf("1.000000000000 "); 61 } 62 else 63 { 64 cnt = 0; 65 dfs(0, known); 66 fenmu = 1; 67 for (int i = 1; i <= unknown; i++) 68 fenmu *= 2; 69 printf("%.12lf ", (double)cnt/(double)fenmu); 70 } 71 } 72 return 0; 73 }