POJ1189:钉子和小球(DP)
来源:互联网 发布:淘宝企业店铺 贷款额度 编辑:程序博客网 时间:2024/06/11 06:14
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是某些钉子被拔掉后小球一条可能的路径。
让一个直径略小于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 <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <algorithm>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 longconst double pi = acos(-1.0);#define Len 63#define mod 19999997const 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<<n; up(i,1,n) { LL t = (i-1)*i/2;//这一排最右边 up(j,1,i)//枚举这一盘所有位置 { if(a[j+t])//钉子存在,那么往左往右各走一般 { dp[i+1][j] += dp[i][j]/2; dp[i+1][j+1] += dp[i][j]/2; } else//钉子不在,往下走,因为是三角形的形状,所以j要+1 dp[i+2][j+1] += dp[i][j]; } } LL x = 1LL<<n; LL r = GCD(x,dp[n+1][m+1]); printf("%I64d/%I64d\n",dp[n+1][m+1]/r,x/r); } return 0;}
0 0
- POJ1189:钉子和小球(DP)
- POJ1189:钉子和小球(dp)
- 【动态规划】poj1189 钉子和小球
- POJ1189钉子和小球,人人为我 我为人人 longlong 位操作
- POJ 1189 钉子和小球 (DP)
- poj 1189 钉子和小球 DP
- POJ 1189 钉子和小球 [dp]
- POJ 1189 钉子和小球 (DP)
- poj 1189 dp(钉子和小球)
- POJ 1189-钉子和小球(DP)
- 【BZOJ1867】[Noi1999]钉子和小球【DP】
- POJ 1189 钉子和小球【基础DP】
- 钉子和小球
- 钉子和小球
- 钉子和小球
- [BZOJ 1867][NOI 1999]钉子和小球(DP水题)
- poj 1189 钉子和小球
- poj 1189 钉子和小球
- 富有诗意的句子
- 批量文件名修改器软件的使用帮助
- 数字万用表使用方法
- linux安装JDK1.6却显示1.7及JDK的卸载
- POJ 2226 - Muddy Fields(二分图匹配)
- POJ1189:钉子和小球(DP)
- 中南大学2012暑期集训中期检测训练赛“跳跳”解题报告
- Qt Model/View 学习笔记 (四)
- Memcached 全部文档
- 2011大纽约区域赛试题 Decoding EDSAC Data 解题报告
- 湘大OJ第1492题 I, Robot
- 关于java中输出流flush()方法
- 湘大OJ第1486题 Civil War
- 湘大OJ第1490题 Generating Random Numbers