设为首页 加入收藏

TOP

POJ1189:钉子和小球(DP)
2015-11-21 01:04:44 来源: 作者: 【 】 浏览:2
Tags:POJ1189: 钉子 小球

Description

有一个三角形木板,竖直立放,上面钉着n(n+1)/2颗钉子,还有(n+1)个格子(当n=5时如图1)。每颗钉子和周围的钉子的距离都等于d,每个格子的宽度也都等于d,且除了最左端和最右端的格子外每个格子都正对着最下面一排钉子的间隙。
让一个直径略小于d的小球中心正对着最上面的钉子在板上自由滚落,小球每碰到一个钉子都可能落向左边或右边(概率各1/2),且球的中心还会正对着下一颗将要碰上的钉子。例如图2就是小球一条可能的路径。
我们知道小球落在第i个格子中的概率pi=pi= \,其中i为格子的编号,从左至右依次为0,1,...,n。
现在的问题是计算拔掉某些钉子后,小球落在编号为m的格子中的概率pm。假定最下面一排钉子不会被拔掉。例如图3是某些钉子被拔掉后小球一条可能的路径。
\

Input

第1行为整数n(2 <= n <= 50)和m(0 <= m <= n)。以下n行依次为木板上从上至下n行钉子的信息,每行中'*'表示钉子还在,'.'表示钉子被拔去,注意在这n行中空格符可能出现在任何位置。

Output

仅一行,是一个既约分数(0写成0/1),为小球落在编号为m的格子中的概pm。既约分数的定义:A/B是既约分数,当且仅当A、B为正整数且A和B没有大于1的公因子。

Sample Input

5 2
*
   * .
  * * *
 * . * *
* * * * *

Sample Output

7/16
 
 
为了避免小数的计算,我们假设最上面有2^n次方个球,然后求出最后到底层有几个球,再以这个数字和2^n求GCD得到概率
 
 
 
 
#include 
  
    #include 
   
     #include 
    
      #include 
     
       #include 
      
        #include
       #include 
        
          #include 
         
           #include 
          
            #include 
           
             using namespace std; #define ls 2*i #define rs 2*i+1 #define up(i,x,y) for(i=x;i<=y;i++) #define down(i,x,y) for(i=x;i>=y;i--) #define mem(a,x) memset(a,x,sizeof(a)) #define w(a) while(a) #define LL long long const double pi = acos(-1.0); #define Len 63 #define mod 19999997 const int INF = 0x3f3f3f3f; LL dp[55][55],a[100005],len; char str[10000]; LL GCD(LL a,LL b) { if(b==0) return a; return GCD(b,a%b); } int main() { LL i,j,k,n,m; w(~scanf("%I64d%I64d",&n,&m)) { len = 1; up(i,1,n) { up(j,1,i) { scanf("%s",str); if(str[0]=='*') a[len++] = 1; else a[len++] = 0; } } mem(dp,0); dp[1][1] = 1LL<
            
           
          
         
         
      
     
    
   
  
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU3768 Shopping(状态压缩DP+sp.. 下一篇hdu 4230 bfs+记忆化搜索

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: