[spoj Favorite Dice ][期望dp]

https://vjudge.net/problem/SPOJ-FAVDICE

题意:有一个n面的骰子,每一面朝上的概率相同,求所有面都朝上过至少一次的总次数期望。

题解:令dp[i]表示 i 面满足条件的期望次数,则有 dp[i]=$\sum_{j=1}^{i-1}$(Pj*(本次操作对最终期望的贡献+dp[i]))+$\sum_{j=1}^{n-(i-1)}$(Qj*(本次操作对最终期望的贡献+dp[i-1])),其中Pj表示出现已经出现过数字的概率,由于是等概率事件,所以这里所有的Pj都是1/n,同理Qj都是1/n,这道题目求的是次数,所以每次操作对最终期望的贡献都是1,所以这道题写下来就是dp[i]=$\sum_{j=1}^{i-1}$((1/n+dp[i])+$\sum_{j=1}^{n-(i-1)}$((1/n)),化简整理可得转移方程dp[i]=dp[i-1]+n/(n-(i-1))

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 #include<map>
 8 using namespace std;
 9 //#define io_test
10 #define debug(x) cout<<x<<"$$$$"<<endl;
11 typedef long long ll;
12 double dp[1005];
13 int main()
14 {
15 #ifdef io_test
16     freopen("in.txt","r",stdin);
17     freopen("out.txt","w",stdout);
18 #endif // io_test
19     int t;
20     scanf("%d",&t);
21     while(t--){
22         int n;
23         scanf("%d",&n);
24         dp[1]=1;
25         for(int i=2;i<=n;i++){
26             dp[i]=dp[i-1]+1.0*n/(n-(i-1));
27            // debug(dp[i]);
28         }
29         printf("%.2lf\n",dp[n]);
30     }
31     return 0;
32 }
View Code

猜你喜欢

转载自www.cnblogs.com/MekakuCityActor/p/10694029.html