hdu 4586 Play the Dice 2013南京邀请赛A 概率dp求期望

Play the Dice

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 847    Accepted Submission(s): 293
Special Judge

Problem Description
There is a dice with n sides, which are numbered from 1,2,...,n and have the equal possibility to show up when one rolls a dice. Each side has an integer ai on it. Now here is a game that you can roll this dice once, if the i-th side is up, you will get ai yuan. What's more, some sids of this dice are colored with a special different color. If you turn this side up, you will get once more chance to roll the dice. When you roll the dice for the second time, you still have the opportunity to win money and rolling chance. Now you need to calculate the expectations of money that we get after playing the game once.
 

Input
Input consists of multiple cases. Each case includes two lines.
The first line is an integer n (2<=n<=200), following with n integers a i(0<=a i<200)
The second line is an integer m (0<=m<=n), following with m integers b i(1<=b i<=n), which are the numbers of the special sides to get another more chance.
 

Output
Just a real number which is the expectations of the money one can get, rounded to exact two digits. If you can get unlimited money, print inf.
 

Sample Input
  
  
6 1 2 3 4 5 6 0 4 0 0 0 0 1 3
 

Sample Output
  
  
3.50 0.00
 

Source
 

Recommend
zhuyuanchen520   |   We have carefully selected several similar problems for you:   4834  4833  4832  4831  4830 
 

题意:有一个n面的骰子,掷到第i面,可得a[i]分。其中有m个面,可获得再掷一次的机会,求掷一次得分的期望。

思路:
解法1:总期望等于子期望的加权和,加权因子为子期望发生的概率。
设所求期望为Exp,因为无限掷,当前状态与转移状态的期望趋于同一极限Exp,Exp有m种转移方式,转移概率均为 1 / n , 即:
Exp= 1 / n * ( ( Exp +a [ b[ 1 ] ] ) + ( Exp +a [ b[ 2 ] ] ) + ... + ( Exp + a[ b[ m ] ] ) ) +  1 / n * ( a [ p ] + ... + a [ p' ] )。设sum为a [ i ] 的和, 化简得:
(1- m / n) * Exp=  1 / n * sum --------->    Exp= sum / ( n - m) 。


解法2: 我们只考虑第一次获得得分的期望为sum / n,对于运气好的,摇中了又获得m / n * sum / n ,运气好又再来一次, 获得( m / n ) ^2 * sum / n,
无穷无尽地摇下去,一共能获得 sum / n * ( 1+ p + p^2 + ... + p^k + ...)  p=m / n ,式子化简Exp = sum / ( n - m) 。


解法3:我们考虑i面,那么i面出现的概率为p( i )= 1 / n + n / m * 1 / n + ( n / m )^2 * 1 / n + ... + ( n / m)^k * 1 / n + ..... ,等比数列求和得:

p( i )= 1 / ( n - m) ,即Exp(i) =a[ i ] * 1 / ( n- m) , 最后求和 Exp =sum / ( n - m) 。 


对以上三种解法,当sum=0, Exp=0; 当 sum !=0 ,m=n ,Exp =inf ; 不然 Exp = sum / ( n- m ),详见程序:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int main()
{
    //freopen("text.txt","r",stdin);
    while(~scanf("%d",&n))
    {
        int sum=0,x;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            sum+=x;
        }
        scanf("%d",&m);
        for(int i=0;i<m;i++)
            scanf("%d",&x);
        if(sum==0)
        {
            printf("0.00\n");
            continue;
        }
        if(n==m)
        {
            printf("inf\n");
            continue;
        }
        printf("%.2f\n",sum*1.0/(n-m));
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值