http://poj.org/problem?id=1189

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

对于每个没有挖掉的钉子(i,j):dp[i+1][j]+=dp[i][j]/2; dp[i+1][j+1]+=dp[i][j]/2; 对于挖掉的钉子(i,j):dp[i+2][j+1]+=dp[i][j]; */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; typedef long long LL; bool a[2555]; int n,m; LL dp[55][55]; LL gcd(LL x,LL y) { if(y==0)return x; return gcd(y,x%y); } int main() { while(~scanf("%d%d",&n,&m)) { int k=1; for(int i=1; i<=n; i++) { for(int j=1; j<=i; j++) { char str[12]; scanf("%s",str); if(str[0]=='*') { a[k++]=true; } else { a[k++]=false; } //printf("%d\n",a[k-1]); } //puts(""); } memset(dp,0,sizeof(dp)); dp[1][1]=1LL<<n; for(int i=1; i<=n; i++) { int x=i*(i-1)/2; for(int j=1; j<=i; j++) { if(a[j+x]) { dp[i+1][j]+=dp[i][j]/2; dp[i+1][j+1]+=dp[i][j]/2; } else { dp[i+2][j+1]+=dp[i][j]; } } } LL x=1LL<<n; LL y=dp[n+1][m+1]; LL g=gcd(x,y); printf("%lld/%lld\n",y/g,x/g); } return 0; }

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5137832.html,如需转载请自行联系原作者

poj1189 简单dp相关推荐

  1. Codeforces 41D Pawn 简单dp

    题目链接:点击打开链接 给定n*m 的矩阵 常数k 以下一个n*m的矩阵,每一个位置由 0-9的一个整数表示 问: 从最后一行開始向上走到第一行使得路径上的和 % (k+1) == 0 每一个格子仅仅 ...

  2. hdu2067 简单dp或者记忆化搜索

    题意: 小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. POJ1088:滑雪(简单dp)

    题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一 ...

  4. 第三讲 数学与简单DP【完结】

    目录 1205. 买不到的数目 [数学结论题] 1211. 蚂蚁感冒 [模拟 / 推理] 1216. 饮料换购 [简单 / 模拟] 2. 01背包问题 [板子题] 1015. 摘花生 [简单DP] 8 ...

  5. hdu 2881(简单dp)

     题意:n*n的矩阵,里面有m个格子是有任务要去完成的,t,x,y表示要在第t秒到达(x,y)的格子完成任务,问你最多可以完成多少 解题思路:简单dp,将时间排个序后就是LIS #include< ...

  6. P1005 矩阵取数游戏(__int128模板/简单dp)

    转跳P1005 题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的 n \times mn×m 的矩阵,矩阵中的每个元素 a_{i,j}a i,j ​ 均为非负整数.游戏规则如下: 每次取数时 ...

  7. 最少拦截系统,简单dp,(学长说这是贪心?!。。。。。。也是醉了)

     description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天, ...

  8. HDU 1158【简单dp】

    题意:给你一个项目,需要几个月来完成买,同时也给你每个月最少需要的工人数.并且告诉你hiring,firing每个工人的钱数,以及每个月应付每个工人的工资.求项目完成时最小花费. 这是个简单dp,思路 ...

  9. 4.15 每周作业 —— 简单DP

    免费馅饼 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submissi ...

最新文章

  1. 如何解决border的重叠问题
  2. 信息提醒之对话框(AlertDialog + ProgressDialog)-更新中
  3. Spring AOP切点表达式详解
  4. AC日记——计算多项式的导函数 openjudge 1.5 38
  5. 软硬件协同漏洞防护技术【会议】
  6. python列表数据类型一致_python自学——数据类型之列表
  7. 合并K个有序数组(链表)【字节跳动面试算法题】
  8. mysql查询结果插原表_新建表需要原表的数据,mysql 如何把查询到的结果插入到新表中...
  9. git bitbucket_如何在Bitbucket上创建新的Git存储库并查看提交的对象
  10. 理顺 JavaScript (7) - 数字相关问题
  11. 软件项目管理实用教程(人民邮电出版)第四章课后习题
  12. VISIO 连接线转角居然默认不是直角,每次要改格式
  13. 自己写了个cgi-bin,报错!
  14. iPhone开发中的技巧整理(四)
  15. 淘宝滞销宝贝怎么处理?面对滞销宝贝怎么正确处理?
  16. 了解计算机的历史用英语怎么说,关于计算机发展历史的论文参考文献 计算机发展历史英语参考文献哪里找...
  17. STM32中的程序在RAM还是FLASH里运行?
  18. 原来raw转换成jpg格式很简单,只要掌握这个技巧
  19. 用RDA5807M实现收音机功能
  20. 工作之余找到生活的意义

热门文章

  1. 你需要的git命令大全来了
  2. Android Studio 环境搭建参考,jdk10javac命令提示不是内部或外部命令
  3. 5、Hive的自定义UDF函数
  4. saltstack 安装nginx
  5. AndroidService 深度分析(2)
  6. .NET Regular Expressions
  7. Fibonacci Knapsack
  8. 用IStateManager管理状态
  9. prometheus 发送恢复 值_Prometheus基础知识介绍
  10. static作用:静态变量的生存周期和作用域