蓝桥杯 概率计算 概率DP

缘起

日常浪费生命~ 蓝桥杯的题(反正又不能提交~ QAQ)

分析

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

简单的概率DP问题. 令

1
dp[i][j]为抽i个数和为j的概率. 则依据条件概率不难知道

$$
dp[i][j]=\frac{1.0}{b-a+1}*\Sigma_{a\le k \le min(j,b)}dp[i-1][j-k]
$$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <string.h>
#include <stdio.h>

double dp[105][10005];//dp[i][j]表示取i个数时和为j的概率

int n, a, b, x;

int main() {
scanf("%d%d%d%d", &n, &a, &b, &x);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
int sum = b - a + 1;
for(int i = 1; i <= n; i ++) {
for(int j = 0; j <= x; j ++) {
for(int k = a; k <= b; k ++) {
if(j >= k) dp[i][j] += dp[i-1][j-k] / sum;
}
}
}
printf("%.4lf\n", dp[n][x]);
return 0;
}

反正也提交不了~ QAQ ~