//poj 1189
//sep9
#include <iostream>
using namespace std;
typedef long long ll;
int n,m;
char g[64][64];
ll dp[64][64];
ll gcd(ll a,ll b)
{
return a%b==0?b:gcd(b,a%b);
}
void print(ll a,ll b)
{
ll d=gcd(a,b);
a/=d;
b/=d;
if(a==0) printf("0");
else
printf("%lld/%lld",a,b);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j){
char s[8];
scanf("%s",s);
g[i][j]=s[0];
}
dp[1][1]=1LL<<n;
for(int i=2;i<=n+1;++i)
for(int j=1;j<=i;++j){
dp[i][j]=0;
if(i-2>=1&&j-1>=1&&i-2>=j-1&&g[i-2][j-1]=='.')
dp[i][j]+=dp[i-2][j-1];
if(i-1>=1&&j-1>=1&&i-1>=j-1&&g[i-1][j-1]=='*')
dp[i][j]+=dp[i-1][j-1]/2;
if(i-1>=1&&j>=1&&i-1>=j&&g[i-1][j]=='*')
dp[i][j]+=dp[i-1][j]/2;
}
print(dp[n+1][m+1],1LL<<n);
return 0;
}
poj 1189 钉子和小球 概率dp转化为计数dp
最新推荐文章于 2018-05-17 12:39:09 发布