题目链接:http://poj.org/problem?id=1189
这题我是这么思考的,将钉子和它左右可以钻过小球的地方都看成空格,那么其实一行的空格数就是2*i+1,i为那行的钉子数。如果有3个钉子,那么要看成7个空格。
和很多人的思路可能不同,我觉得该行的可能性可以先照抄上面一行的(当然位置要调整),然后如果该点是钉子的话,将它的可能行平分给左右的空格,所以每行是钉子地方的可能行都是0,这样也就能覆盖把钉子拔出,小球直接落下的情况,因为一开始我们就复制了上一行的可能性。下面上代码:
#include<iostream>
#include<algorithm>
#include<sstream>
#include<cmath>
using namespace std;
#define llong long long
llong maxCommon(llong a,llong b)
{
return a%b==0?b:(maxCommon(b,a%b));
};
const llong N=110;
llong dp[N][N];
char input[N][N];
int main()
{
for(llong i=0;i<N;i++)
for(llong j=0;j<N;j++)
dp[i][j]=0;
llong n,m;
cin>>n>>m;
for(llong i=1;i<=n;i++)
for(llong j=1;j<=i;j++)
cin>>input[i][j];
llong sum=1;
sum<<=n;
if(input[1][1]=='*')
{
dp[1][1]=sum/2;
dp[1][2]=0;
dp[1][3]=sum/2;
}
else
{
dp[1][1]=0;
dp[1][2]=sum;
dp[1][3]=0;
}
for(llong i=2;i<=n;i++)
{
dp[i][0]=0;
llong j=1;
for(;j<=2*i;j++)
dp[i][j]=dp[i-1][j-1];
dp[i][j]=0;
for(llong k=2;k<=2*i;k+=2)
{
if(input[i][k/2]=='*')
{
dp[i][k-1]+=dp[i][k]/2;
dp[i][k+1]+=dp[i][k]/2;
dp[i][k]=0;
}
}
}
llong result=dp[n][2*m+1];
llong common=maxCommon(1<<n,result);
if(result==0)
cout<<"0/1"<<endl;
else
cout<<result/common<<"/"<<sum/common<<endl;
return 0;
}
POJ上面的易错的数据都已经测试过,例如:
5 2 . * . * . * * * * * * * * * * 1/2
6 3 . * * * . * * * * * * * . * * * * * * * * 1/1
#1)( 答案是710466673 / 4294967296 ) 33 16 * ** *** **** ***** ****** ******* ******** ********* ********** *********** **.**.**.*** ******.****** *****.******** ****.****.***** ******.********* ***.*.****.****** *****.*****.****** ***.*****.***.***** ***********.******** *********.*********** ********************** ********.************** ******.***.************* *********.**.************ **********.*************** ********.***************.** ***********************.**** ***********************.***** ***************.************** **************.**************** ******************************** *********************************
#2)(答案是5723285335 / 34359738368) 35 16 * ** *** **** ***** ****** ******* ******** ********* **.******* *********** **.**.**.*** ******.****** *****.******** ****.****.***** ******.********* ***.*.****.****** *****.*****.****** ***.*****.***.***** ***********.******** *********.*********** ********************** ********.************** ******.***.************* *********.**.************ **********.*************** ********.***************.** ***********************.**** ***********************.***** ***************.************** **************.**************** *******..*********************** **********.***..***************** *************.***..*************** ***********************************
数据都测试过了呀!!!!!!!!
但是一直木有accept啊!
求哪位大牛能指出啊?!