我觉得有一种情况 网上代码没考虑 但是可以AC poj数据很弱:
5 3
*
* *
* * *
* * * *
. . . . .
这样算出来每个洞里的概率都为0 应该是错的 因为有个方程 dp[i+2][j+1]+=dp[i][j]; 会忽略已经掉到洞里了。
#include<cstdio>
#include<cstring>
long long gcd(long long a,long long b)
{
return b==0?a:gcd(b,a%b);
}
long long dp[55][55];
int main()
{
int n,m;
char str[60][60],ch;
scanf("%d%d",&n,&m);
getchar();
for(int i=1;i<=n;i++)
{
int tot=1;
while((ch=getchar())!='\n')
{
if(ch=='*'||ch=='.')
{
str[i][tot]=ch;
tot++;
}
}
}
dp[1][1]=1LL<<n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(str[i][j]=='*')
{
dp[i+1][j]+=dp[i][j]>>1;
dp[i+1][j+1]+=dp[i][j]>>1;
}
else
{
if(i==n)
{
dp[i+1][j+1]+=dp[i][j]>>1;
dp[i+1][j]+=dp[i][j]>>1;
}
else
dp[i+2][j+1]+=dp[i][j];
}
}
}
long long int res=gcd(1LL<<n,dp[n+1][m+1]);
printf("%lld/%lld\n",dp[n+1][m+1]/res,(1LL<<n)/res);
return 0;
}