概率+DP,比较经典的题。按照递推的方式计算概率。
#include <cstdio>
#include <cstring>
int n,m,i,j,a[100][100];
long long p[100][100][2];

inline long long gcd(long long a,long long b)
{
if (b==0) return a;
else return gcd(b,a%b);
}

inline void add(long long a,long long b,long long &c,long long &d)
{
long long t1,t2,t3,t4;
t1=gcd(b,d);
t2=b/t1*d;
t3=d/t1*a;
t4=b/t1*c;
c=t3+t4;
d=t2;
t1=gcd(c,d);
c/=t1;
d/=t1;
};

int main ()
{
scanf("%d%d",&n,&m);

for (i=1;i<=n;i++) for (j=1;j<=i;j++)
{
char s[100];
scanf("%s",s);
if (s[0]=='*') a[i][j]=1; else a[i][j]=0;
}
memset(p,0,sizeof(p));

for (i=1;i<=n+1;i++) for (j=1;j<=i;j++)
{
p[i][j][0]=0;
p[i][j][1]=1;
}
p[1][1][0]=p[1][1][1]=1;

for (i=1;i<=n;i++) for (j=1;j<=i;j++)
{

if (a[i][j]==1)
{
add(p[i][j][0],2*p[i][j][1],p[i+1][j][0],p[i+1][j][1]);
add(p[i][j][0],2*p[i][j][1],p[i+1][j+1][0],p[i+1][j+1][1]);
}
else add(p[i][j][0],p[i][j][1],p[i+2][j+1][0],p[i+2][j+1][1]);
}
printf("%I64d/%I64d\n",p[n+1][m+1][0],p[n+1][m+1][1]);
return 0;
}