题链:这里
题意:
给你一个串s1,和一个串s2
然后s2中有一些问号,有0.5的概率是向左边,有0.5的概率是向右边走。
问你s2结束之后,恰好走到s1串走到的目的地的概率是多少。
解法:
一种是直接用组合数来计算,一种是概率DP,dp[i][j]表示考虑到执行第二个串的第i位现在在j位置的概率是多少。为了让数组下标不为负数,这里初始位置从50开始进行修正。
//CF 476B
#include <bits/stdc++.h>
using namespace std;
double dp[100][100];//dp[i][j]表示考虑到执行第二个串的第i位现在在j位置的概率是多少
char s1[50], s2[50];
int main(){
scanf("%s%s", s1+1, s2+1);
int pos1, pos2;
pos1 = 50, pos2 = 50;
int len1 = strlen(s1+1);
for(int i = 1; i <= len1; i++){
if(s1[i] == '+') pos1++;
else pos1--;
}
dp[0][pos2] = 1;
for(int i = 1; i <= len1; i++){
if(s2[i] == '+') for(int j = 1; j < 100; j++)
dp[i][j] = dp[i-1][j-1];
if(s2[i] == '-') for(int j = 0; j < 99; j++)
dp[i][j] = dp[i-1][j+1];
if(s2[i] == '?')for(int j = 1; j < 99; j++)
dp[i][j] = 0.5*dp[i-1][j-1] + 0.5*dp[i-1][j+1];
}
printf("%.12f\n", dp[len1][pos1]);
return 0;
}