zoukankan      html  css  js  c++  java
  • Dice (III) 概率dp

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int t,n;
    double dp[100010];
    int main()
    {
    	scanf("%d",&t);
    	int cas=1;
    	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("Case %d: %.8lf
    ",cas++,dp[0]);
    	}
    }
    

      这一题期初我怎么也没理解这递推方程。后来想通一个说法。

    dp[i]表示您还差i面没扔出来时你扔的次数。

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

    dp[i]=dp[i+1]+(double)(n)/(n-i);
    现在让我来分析一下:
    为什么i/n*dp[i]+(n-i)/n*dp[i+1]呢,我觉得是(n-i)/n*(dp[i]+1)+(i+1)/n*(dp[i+1]+1)
    其实这个要反着考虑一下。就是n个你选i个里面的那么造成了dp[i],不然还是dp[i+1].。这个从后往前。
  • 相关阅读:
    polya定理
    树状数组
    离散数学通路数的矩阵计算法
    高次同余方程求解
    Uva1378
    poj2888
    poj2409&&poj1286
    poj2182
    poj2154
    判断一个字符是否为汉字
  • 原文地址:https://www.cnblogs.com/newadi/p/4729985.html
Copyright © 2011-2022 走看看