zoj 3640 Help Me Escape(概率dp[记忆搜索])

来源:互联网 发布:java变量重新赋值 编辑:程序博客网 时间:2024/05/16 06:37

题意:

一个人,想走出一个困境,每次他都可以从n条路中选择一条路,每条路选择的概率是一样的,并且每次的n条路都一样,每条路都有一个值c[i],当且仅当这个人的力量大于c[i]时才能选择这条路。

那么问题来了:求这个人逃出困境的期望。

题解:

状态:dp[v] = sum{ ti/n }, v > c[i]dp[v] = sum{ (dp[v+c[i]] + 1)/n }, v<=c[i]

观察容易发现,用记忆搜索比较好写。

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>using namespace std;//typedef __int64 lld;#define oo 0x3f3f3f3f#define Mod 1000000007#define maxn 200005#define maxm 105#define Exp 1e-9double dp[maxn];int c[maxm];int n,f;int ti(int C){    return (1.0+sqrt(5.0))/2.0*C*C;}double Dp(int v){    if(dp[v]>0.0)        return dp[v];    dp[v]=0.0;    for(int i=1;i<=n;i++)    {        if(v>c[i])            dp[v]+=1.0*ti(c[i])/n;        else            dp[v]+=(Dp(v+c[i])+1.0)/n;    }    return dp[v];}int main(){    while(scanf("%d %d",&n,&f)!=EOF)    {        memset(dp,0,sizeof dp);        for(int i=1;i<=n;i++)            scanf("%d",&c[i]);        printf("%.3lf\n",Dp(f));    }    return 0;}


0 0