zoj 3640 Help Me Escape(概率dp[记忆搜索])
2015-01-25 17:50
393 查看
题意:
一个人,想走出一个困境,每次他都可以从n条路中选择一条路,每条路选择的概率是一样的,并且每次的n条路都一样,每条路都有一个值c[i],当且仅当这个人的力量大于c[i]时才能选择这条路。
那么问题来了:求这个人逃出困境的期望。
题解:
观察容易发现,用记忆搜索比较好写。
一个人,想走出一个困境,每次他都可以从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-9 double 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; }
相关文章推荐
- ZOJ 3640 Help Me Escape(概率-期望DP+神坑)
- ZOJ 3640 Help Me Escape(概率dp)
- zoj 3640 Help Me Escape(概率DP)
- zoj 3640 Help Me Escape 期望DP 简单题 适合记忆化搜索
- ZOJ - 3640 Help Me Escape(概率dp)
- 简单概率dp(期望)-zoj-3640-Help Me Escape
- zoj 3640 Help Me Escape(概率dp)
- ZOJ 3640 Help Me Escape(概率dp求期望)
- zoj 3640 Help Me Escape(概率DP)
- ZOJ 3640 Help Me Escape (概率DP)
- zoj 3640 Help Me Escape(概率DP基础)
- zoj 3640 Help Me Escape (概率dp 递归求期望)
- zoj 3640 Help Me Escape (概率dp)
- ZOJ-3640 Help Me Escape 概率DP
- ZOJ-3640 Help Me Escape (概率DP)
- ZOJ 3640 Help Me Escape 概率DP 记忆化DFS
- ZOJ 3640 Help Me Escape 概率DP
- zoj 3640 Help Me Escape 概率DP
- zoj-3640-Help Me Escape-概率DP
- ZOJ 3640 Help Me Escape(概率dp+记忆化)