您的位置:首页 > 其它

ZOJ 3640 Help Me Escape (概率DP)

2015-07-12 00:18 423 查看
题意很好理解,略去不说了。

思路:设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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: