关于期望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; }