算法提高 概率计算(概率dp)

    xiaoxiao2021-03-25  50

    问题描述   生成n个∈[a,b]的随机整数,输出它们的和为x的概率。 输入格式   一行输入四个整数依次为n,a,b,x,用空格分隔。 输出格式   输出一行包含一个小数位和为x的概率,小数点后保留四位小数 样例输入 2 1 3 4 样例输出 0.3333 数据规模和约定   对于50%的数据,n≤5.   对于100%的数据,n≤100,b≤100.

    题解:简单的概率dp。

    设dp[ i ][ j ]表示抽i个数,和为j的概率。

    那么状态转移方程为:

    dp[ i ] [ j ] += dp[ i - 1 ][ j - k ]*1.0/(b-a+1). (j > k).

    代码:

    #include<bits/stdc++.h> using namespace std; double dp[110][11000]; //dp[i][j]表示抽 i个数和为j的概率 int main() { int n,a,b,x; cin>>n>>a>>b>>x; for(int i=a;i<=b;i++){ dp[1][i]=1.0/(b-a+1); } for(int i=2;i<=n;i++){ for(int k=a;k<=b;k++){ //第i个数为 k for(int j=1;j<=x;j++){ //和为 j if(j-k>0){ dp[i][j] += dp[i-1][j-k]*1.0/(b-a+1); } } } } printf("%.4lf\n",dp[n][x]); return 0; }

    转载请注明原文地址: https://ju.6miu.com/read-38145.html

    最新回复(0)