HDU5781(概率DP)

来源:互联网 发布:明代斗彩天字罐淘宝 编辑:程序博客网 时间:2024/06/08 04:19

题意:钱的范围是0-2000,最多可悲警告k次,问取出所有钱的次数期望。

分析:因为这个人足够聪明,所以她一定会每次折半取,所以这样的话最多也就给警告log次,该题也就是11。所以只需要枚举她可能的钱数和警告次数。怎么转移呢?


吐过取出k的钱之后没有警告,那么就转移到dp[i-k][j],如果给警告了,那么就说明钱最多为k-1块,转移到dp[k-1][j-1]。这又分别是多少概率呢?能取到k块,说明钱肯定大于k了,所以概率为(i-k+1)/(i+1)(因为可能有0块),反之就是(k)/(i+1),然后+1.当前消耗了一步。

#include<bits/stdc++.h>using namespace std;typedef long long ll;double dp[2010][12];void init(){    for(int i=0;i<=2000;i++)    {        dp[i][0]=1e20;    }    for(int i=0;i<=11;i++)        dp[0][i]=0;    for(int i=1;i<=2000;i++)    {        for(int j=1;j<=11;j++)        {            double t=1e20;            for(int k=1;k<=i;k++)            {                t=min(t,dp[i-k][j]*(i-k+1.0)/(i+1.0)+dp[k-1][j-1]*k/(i+1.0)+1);            }            dp[i][j]=t;        }    }}int main(){    init();    int k,w;    while(scanf("%d%d",&k,&w)!=EOF)    {        if(w>11)w=11;        printf("%.6lf\n",dp[k][w]);    }    return 0;}


原创粉丝点击