LightOJ - 1030 概率dp

题意:n个格子,每次走1-6步(等概率),走过的格子加上价值,如果走的步数超过n,重选,走到n结束,求价值的期望

题解:概率dp,dp[i]表示第i位走过的概率,只有前6个格子能转移到当前格子,转移到当前格子的概率是1/6(如果后面有6个及以上的格子),否则是1/剩余的格子数,最后用每一位的概率*价值就是期望了

#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pii pair<int,int>

using namespace std;

const double g=10.0,eps=1e-12;
const int N=200+10,maxn=200000+10,inf=0x3f3f3f3f;

double dp[N],a[N];
int main()
{
    int res=0,t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&a[i]);
            dp[i]=0.0;
        }
        dp[1]=1;
        for(int i=2;i<=n;i++)
        {
            for(int j=max(1,i-6);j<i;j++)
            {
                if(n-j>=6)dp[i]+=dp[j]*1.0/6.0;
                else if(n-j>=1)dp[i]+=dp[j]*1.0/(n-j);
            }
        }
      /*  for(int i=1;i<=n;i++)
            printf("%.10f\n",dp[i]);*/
        double ans=0;
        for(int i=1;i<=n;i++)
            ans+=dp[i]*a[i];
        printf("Case %d: %.10f\n",++res,ans);
    }
    return 0;
}
/********************

********************/
View Code

 

posted @ 2017-12-06 13:01  walfy  阅读(152)  评论(0编辑  收藏  举报