慕流年


私信TA

用户名:QWE1997

访问量:1154

签 名:

等  级
排  名 94385
经  验 106
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 未知
专  业

  自我简介:

TA的其他文章

解题思路:
题目一看,基本就是一道求概率的题目。仔细看下,感觉直接求有点麻烦,所以我们尝试使用动态规划的思想。题意基本等于让我们求用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 人评分

  评论区

  • «
  • »