hdu 4089 Activation 概率dp 消元
2014-07-20 09:51
453 查看
虽然是求概率,但是和倒着求期望有些类似,使用的是全概率公式dp[i][j]表示的是从这一点到达目标点的概率
图中有环,只能消元,成环有一定的规律,先求dp[i][i]
参考 http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710987.html
图中有环,只能消元,成环有一定的规律,先求dp[i][i]
参考 http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710987.html
#include<iostream> #include<algorithm> #include<iostream> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<vector> #include<queue> #include<cmath> using namespace std; #define ll long long #define inf 0x3f3f3f3f int dir[4][2]={0,1,0,-1,1,0,-1,0}; const double eps=1e-8; double c[2005]; double pp[2005]; double dp[2005][2005]; int n,m,k; double p1,p2,p3,p4,p,p31,p41; int main() { while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF) { if(p4<eps) { printf("0.00000\n"); continue; } memset(dp,0,sizeof(dp)); memset(c,0,sizeof(c)); int i,j; p=p2/(1.0-p1); p31=p3/(1.0-p1); p41=p4/(1.0-p1); pp[0]=1.0; for(int i=1;i<=n;i++) pp[i]=p*pp[i-1]; dp[1][1]=p41/(1-p); c[1]=p41; for(int i=2;i<=n;i++) { for(int j=2;j<=k&&j<=i;j++) c[j]=p31*dp[i-1][j-1]+p41; for(int j=k+1;j<=i;j++) c[j]=p31*dp[i-1][j-1]; double tmp=c[1]*pp[i-1]; for(int j=2;j<=i;j++) tmp+=c[j]*pp[i-j]; dp[i][i]=tmp/(1-pp[i]); dp[i][1]=p*dp[i][i]+c[1]; for(int j=2;j<i;j++) dp[i][j]=p*dp[i][j-1]+c[j]; } printf("%.5lf\n",dp [m]); } return 0; }
相关文章推荐
- hdu 4089 Activation (概率dp 手动消元)
- HDU-4089 Activation 概率DP
- HDU 4089 Activation (概率DP 好题)
- HDU 4089 Activation(概率DP)
- hdu 4089 Activation(概率dp)
- HDU 4089 Activation【概率DP】
- Hdu 4089 Activation (概率dp) - 2011 ACM-ICPC Beijing Regional Contest Problem I
- 【HDU】 4089 Activation 概率DP
- HDU 4089 Activation(概率DP好题)——2011 Asia Beijing Regional Contest
- hdu 4089 Activation 概率dp
- HDU-4089 Activation(概率DP)
- HDU 4089 Activation 概率DP 难度:3
- HDU 4089 Activation 概率dp
- [HDU 4089]Activation[概率DP]
- HDU 4089 Activation (概率DP )
- HDU 4089 Activation(概率DP)
- HDU 4089 Activation 概率DP
- [HDU 4089]Activation[概率DP]
- hdu 4089 Activation(概率dp)
- HDU 4089 Activation 概率DP 2011年区域赛北京现场赛I题