SP1026 FAVDICE - Favorite Dice 期望dp
傳送門
文章目錄
- 題意:
- 思路:
題意:
一個n面的骰子,求期望擲幾次能使得每一面都被擲到。
思路:
考慮期望dpdpdp。定義f[i]f[i]f[i]表示有iii面了,還需要多少次能到nnn面。當前是iii面,所以選到新的面的概率是n?in\frac{n-i}{n}nn?i?,選到已經有的面的概率是in\frac{i}{n}ni?。那么轉移也就比較明顯了:f[i]=f[i+1]?n?in+f[i]?in+1f[i]=f[i+1]*\frac{n-i}{n}+f[i]*\frac{i}{n}+1f[i]=f[i+1]?nn?i?+f[i]?ni?+1
轉化成人話就是:我們有n?ii\frac{n-i}{i}in?i?的概率再需要f[i+1]f[i+1]f[i+1]步,有in\frac{i}{n}ni?的概率再需要f[i]f[i]f[i]步。
當然還有別的解法。
我們知道1概率=期望\frac{1}{概率}=期望概率1?=期望,而且期望=期望+期望期望=期望+期望期望=期望+期望,可以先求出概率讓后取倒數即可。
假設當前有iii個不同的數,得到新數的概率是p=n?inp=\frac{n-i}{n}p=nn?i?,那么期望就是1p=nn?i\frac{1}{p}=\frac{n}{n-i}p1?=n?in?,答案就是∑i=0n?1nn?i=∑i=1nni\sum_{i=0}^{n-1} \frac{n}{n-i}=\sum_{i=1}^{n}\frac{n}{i}∑i=0n?1?n?in?=∑i=1n?in?。
下面是概率dpdpdp解法。
//#pragma GCC optimize(2) #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<map> #include<cmath> #include<cctype> #include<vector> #include<set> #include<queue> #include<algorithm> #include<sstream> #include<ctime> #include<cstdlib> #define X first #define Y second #define L (u<<1) #define R (u<<1|1) #define pb push_back #define mk make_pair #define Mid (tr[u].l+tr[u].r>>1) #define Len(u) (tr[u].r-tr[u].l+1) #define random(a,b) ((a)+rand()%((b)-(a)+1)) #define db puts("---") using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); } //void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); } //void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f; const double eps=1e-6;int n; double ans;int main() { // ios::sync_with_stdio(false); // cin.tie(0);int _; scanf("%d",&_);while(_--){scanf("%d",&n);ans=0.0;for(int i=n-1;i>=0;i--) ans+=1.0*n/(n-i);printf("%.2f\n",ans);}return 0; } /**/總結
以上是生活随笔為你收集整理的SP1026 FAVDICE - Favorite Dice 期望dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序之打卡日历
- 下一篇: vim折叠(非常好的功能)