poj 1189 钉子和小球

本文介绍了一种使用动态规划方法解决在特定布局的等边三角形钉板上,移除部分钉子后小球从顶部落下到达底部指定位置概率的问题。通过逐层递推计算各路径概率,并最终简化为最简分数形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 转载http://martinblack954.blog.163.com/blog/static/186105210201154102623873/

题意:在一块木板上,钉上钉子,排布成等边三角形。一个球从顶部开始,自由下落。每碰到一个钉子以后,等概率地向两边继续滚。现从该等边三角形的钉子中,拔去其中某些钉子。求这个球从顶部开始下落,滚到底部某个格子的概率。
思路:DP模拟。逐步递推,分别计算每一层,滚到每一个口的概率。最后一层每个口的概率,就是对应底部每个格子的概率。每一个口的概率,若遇到一个钉子,则除以2后就是下一层对应两个口的概率;若没遇到钉子,则直接等于再下层的对应入口,即直接落下。一开始的初值,就是2^层数,即全部都是钉子时,第一个格子对应的概率。
PS:层数有50,所以初始概率需要long long。
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;
int const maxn = 51 + 51 * 50 / 2;
int n, m;
long long dp[55][55];
bool triangle[maxn];

long long gcd(long long a, long long b)
{
    if(b)
        return gcd(b, a % b);
    return a;
}

int main()
{
    scanf("%d %d", &n, &m);
    char s[5];
    int index = 1;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= i; j++)
        {
            scanf("%s", s);
            if(s[0] == '*')
                triangle[index++] = true;
            else
                triangle[index++] = false;
        }
    }
    dp[1][1] = 1;
    for(int i = 1; i <= n; i++)
        dp[1][1] <<= 1;
    for(int i = 1; i <= n; i++)
    {
        int id = i * (i - 1) / 2;
        for(int j = 1; j <= i; j++)
        {
            if(triangle[id + j])
            {
                dp[i+1][j] += dp[i][j] >> 1;
                dp[i+1][j+1] += dp[i][j] >> 1;
            }
            else
            {
                dp[i+2][j+1] += dp[i][j];
            }
        }
    }
    long long ans1 = dp[n+1][m+1];
    long long ans2 = 0;
    for(int i = 1; i <= n + 1; i++)
        ans2 += dp[n+1][i];

    long long k = gcd(ans1,ans2);
    if(ans1 == 0)
    {
        ans2 = 1;
        k = 1;
    }
    printf("%lld/%lld\n", ans1 / k, ans2 / k);

}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值