关于期望dp的个人理解

  对于高一没学组合与概率的蒟蒻来说,期望dp真的搞不太懂。

 

  讲一点个人见解,期望dp其实不太类似一般dp那样从子状态转移并最终得到终状态,而是类似递推地从不同的情况得出结论。

 

  期望dp的状态转移方程一般像这样: dp[i] = ∑所有可以得到状态i的状态 * 这些状态转移来的概率

 

  举个🌰,spoj1026

 

  题意是问一个n面的色子期望丢几次可以丢出所有面(丢出各个面的概率相同)

 

  设dp[i]为还剩i个面没有丢出,可知有i/n的概率你丢到了重复的面,所以要从dp[i]转移来。同时你有n - i / n的概率由剩i + 1个面丢到了新的面,所以要从dp[i + 1]转移来。而每次不论结果,你都又多丢了一次,所以可列出:

  

  dp[i] = (dp[i] + 1) * i / n + (dp[i + 1] + 1) * (n - i) / n;

 

  化简得 dp[i] = dp[i + 1] + n / (n - i);

 

  代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

int n,t;
double dp[2000];

int main() {
    scanf("%d",&t);
    while (t--) {
        scanf("%d",&n);
        dp[n] = 0;
        for (int i = n - 1;i >= 0;i--)
            dp[i] = dp[i + 1] + (double)n/(n - i);
        printf("%.2lf\n",dp[0]);
    }
    return 0;
}

 

posted @ 2020-11-12 20:19  I11usi0ns  阅读(190)  评论(1编辑  收藏  举报