UVA 10759 Dice Throwing

UVA_10759:动态规划与概率问题的巧妙解决
本文探讨了如何使用动态规划解决一个与概率和多个色子投掷相关的问题。通过分析最多六个色子状态的组合,作者展示了如何高效计算不超过特定值X的状态总数,并最终进行简化得到最终答案。

UVA_10759

    我们不妨把N个色子看成是依次投掷的,这样最多才6^N个状态,用long long是可以表示的,而我们又比较容易用DP求出不大于X的状态总数,这样计算完之后再约分一下即可。

#include<stdio.h>
#include<string.h>
int N, X;
long long int f[30][160];
long long int gcd(long long int x, long long int y)
{
return y == 0 ? x : gcd(y, x % y);
}
void solve()
{
int i, j, k, p;
long long int a, b, c;
memset(f, 0, sizeof(f));
for(j = 1; j <= 6; j ++)
for(k = j + 1; k <= X; k ++)
f[1][k] += 1;
for(i = 2; i <= N; i ++)
for(j = 1; j <= 6; j ++)
for(k = j + 2; k <= X; k ++)
f[i][k] += f[i - 1][k - j];
b = 1;
for(i = 1; i <= N; i ++)
b *= 6;
a = b - f[N][X];
c = gcd(b, a);
a /= c, b/= c;
if(a == 0)
printf("0\n");
else if(b == 1)
printf("1\n");
else
printf("%lld/%lld\n", a, b);
}
int main()
{
for(;;)
{
scanf("%d%d", &N, &X);
if(!N && !X)
break;
solve();
}
return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值