现在的位置: 首页 > 综合 > 正文

POJ 1189 钉子和小球 思路+疑惑

2018年04月03日 ⁄ 综合 ⁄ 共 2443字 ⁄ 字号 评论关闭

题目链接: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啊!

求哪位大牛能指出啊?!

抱歉!评论已关闭.