http://codeforces.com/problemset/problem/476/B
题意:给两个‘+’‘-’字符串,第二次串有'?'可+,-;问第二个串到第一串概率;
思路:(1)dfs,记录可行个数;(2)排列组合;(3)dp[i][j],串的i位置在坐标j的概率
dfs:
#include<bits/stdc++.h>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<ctime>
#include<map>
#include<stack>
#include<string>
using namespace std;
#define sfi(i) scanf("%d",&i)
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-6
#define PI acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
ll gcd(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int maxn=1e6+9;
const int mod=1e9+7;
template <class T>
inline void sc(T &ret)
{
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0'), c = getchar();
}
}
string s,t;
int point=0;
int num=0;
int n;
void dfs(int cnt,int p)
{
if(cnt==n)
{
if(p==point)
{
num++;
}
return ;
}
if(t[cnt]=='+')
{
dfs(cnt+1,p+1);
}
else if(t[cnt]=='-')
{
dfs(cnt+1,p-1);
}
else
{
dfs(cnt+1,p+1);
dfs(cnt+1,p-1);
}
}
int main()
{
;
cin>>s;
cin>>t;
n=s.length();
for(int i=0;i<n;i++)
{
if(s[i]=='+') point++;
else point--;
}
int wen=0;
for(int i=0;i<n;i++)
{
if(t[i]=='?') wen++;
}
dfs(0,0);
if(!num)
{
printf("%0.12f\n",0.0);
}
else
{
double ans=num*1.0/pow(2,wen);
printf("%0.12f\n",ans);
}
return 0;
}
排列组合:
#include<bits/stdc++.h>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<ctime>
#include<map>
#include<stack>
#include<string>
using namespace std;
#define sfi(i) scanf("%d",&i)
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-6
#define PI acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
ll gcd(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int maxn=1e6+9;
const int mod=1e9+7;
template <class T>
inline void sc(T &ret)
{
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0'), c = getchar();
}
}
int dp[maxn];
int a[maxn];
ll c[12][12];
void inint()
{
for(int i=0;i<12;i++)
{
c[i][0]=1;
c[i][i]=1;
for(int j=1;j<i;j++)
{
c[i][j]=c[i-1][j]+c[i-1][j-1];
}
}
}
int main()
{
inint();
string s,t;
cin>>s;
cin>>t;
int n=s.length();
int m=t.length();
int a=0,b=0,bb=0;
int aa=0;
int num=0;
for(int i=0;i<n;i++)
{
if(s[i]=='+') a++;
else aa++;
}
for(int i=0;i<m;i++)
{
if(t[i]=='+') b++;
else if(t[i]=='-') bb++;
else num++;
}
double ans=0;
if(num==0&&a==b)
{
printf("%0.12f\n",1.0);
}
else if(a<b||aa<bb)
{
printf("%0.12f\n",0.0);
}
else
{
int k=a-b;
ans=c[num][k]*1.0/pow(2,num);
printf("%0.12f\n",ans);
}
return 0;
}
dp:
#include<bits/stdc++.h>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<queue>
#include<cmath>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<ctime>
#include<map>
#include<stack>
#include<string>
using namespace std;
#define sfi(i) scanf("%d",&i)
#define pri(i) printf("%d\n",i)
#define sff(i) scanf("%lf",&i)
#define ll long long
#define mem(x,y) memset(x,y,sizeof(x))
#define INF 0x3f3f3f3f
#define eps 1e-6
#define PI acos(-1)
#define lowbit(x) ((x)&(-x))
#define zero(x) (((x)>0?(x):-(x))<eps)
#define fl() printf("flag\n")
ll gcd(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int maxn=1e6+9;
const int mod=1e9+7;
template <class T>
inline void sc(T &ret)
{
char c;
ret = 0;
while ((c = getchar()) < '0' || c > '9');
while (c >= '0' && c <= '9')
{
ret = ret * 10 + (c - '0'), c = getchar();
}
}
char s[300],t[300];
int point=50;
double dp[200][200];
int main()
{
scanf("%s%s",s+1,t+1);
int n=strlen(s+1);
for(int i=1;i<=n;i++)
{
if(s[i]=='+') point++;
else point--;
}
dp[0][50]=1;
for(int i=1;i<=n;i++)
{
if(t[i]=='+')
{
for(int j=1;j<=100;j++)
dp[i][j]=dp[i-1][j-1];
}
else if(t[i]=='-')
{
for(int j=1;j<100;j++)
dp[i][j]=dp[i-1][j+1];
}
else
{
for(int j=1;j<100;j++)
dp[i][j]=0.5*dp[i-1][j-1]+0.5*dp[i-1][j+1];
}
}
printf("%0.12f\n",dp[n][point]);
return 0;
}