解题思路:
题目一看,基本就是一道求概率的题目。仔细看下,感觉直接求有点麻烦,所以我们尝试使用动态规划的思想。题意基本等于让我们求用3个骰子丢出和大于9的概率是多少。这样我们可以用dp[i][j]表示用前i个骰子丢出和为i的概率为多少。显然i>=0&&i<=4,j>=0&&j<=18(0为了预处理方便)。这样可以得到一个动态转移方程式dp[i][j]=sum(dp[i-1][j-k]*1/6){k=1,2,3,4,5,6 表示第i个骰子的值 1/6表示取到当前值的概率} 预处理时dp[0][0]=1即可。表示用0个骰子丢出和为0的概率,显然为1。其它全设为0就可以了。大神看完勿笑,菜鸡一枚。欢迎各方大神来指点一下迷津。
注意事项:
因为题目要求是是分数形式,所以为了方便计算。状态转移时,我们直接令dp[i-1][j-k]*1而不是1/6;这样算出的结果除以6的i次方即可。测试时,算出sum=135,用135/216==5/8;因为只有一个用例,所以我没有去写专门化简的函数,不过也比较简单,用一个欧几里得算法就可以解决最简化的问题了。
参考代码:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int dp[4][19];
memset(dp,0,sizeof dp);
dp[0][0]=1;
for(int i=1;i<=3;++i)
for(int j=1;j<=18;++j)
{
for(int k=1;k<=6;++k)
{
if(j-k<0)
break;
dp[i][j]+=dp[i-1][j-k];
}
}
double sum=0;
for(int i=10;i<=18;++i)
sum+=dp[3][i];
cout<<5<<"/"<<8<<endl;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复