ZOJ 3640 Help Me Escape (概率DP)

来源:互联网 发布:papi酱软件 编辑:程序博客网 时间:2024/05/22 02:20

题意很好理解,略去不说了。

思路:设dp[i]为战斗力为i时走出洞穴的期望。

先对c[]从小到大排序。

再二分查找c>=i的位置。

那么期望逆推得 dp[i] = (t1 + t2 + ......tk-1 + dp[i+ck] + 1 + ..... dp[i+cn] + 1) / n。


我的代码:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>using namespace std;const int MAX = 20005;const int maxn = 105;double dp[MAX];int n,f,c[maxn],t[maxn];int calc(int x){    return (int)floor((1.0 + sqrt(5.0))*x*x / 2.0);}void solve(){    memset(dp,0,sizeof(dp));    for(int i = MAX - 1 ; i >= f ; i--){        int k = lower_bound(c,c+n,i) - c;        for(int j = 0 ; j < k ; j++)            dp[i] += 1.0 * t[j] / n;        for(int j = k ; j < n ; j++)            dp[i] += 1.0 * (dp[i + c[j]] + 1) / n;    }    //for(int i = 1 ; i < 10 ; i++) cout<<dp[i]<<endl;    printf("%.3f\n",dp[f]);}int main(){    while(~scanf("%d%d",&n,&f)){        for(int i = 0 ; i < n ; i++)            scanf("%d",&c[i]);        sort(c,c+n);        for(int i = 0 ; i < n ; i++)            t[i] = calc(c[i]);        solve();    }    return 0;}


0 0
原创粉丝点击