概率DP合集
来源:互联网 发布:js base64性能 编辑:程序博客网 时间:2024/04/28 01:18
http://www.bnuoj.com/v3/contest_show.php?cid=7521#problem/D
根据kuangbin的概率DP集合刷的 Orz 感谢kuangbin巨巨
http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html
上边的blog已经总结的很好了…
剩下的题有些东西没学以后再补…
B.POJ 2096 Collecting Bugs
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define sfor(i,a,h) for(i=h[a];i!=-1;i=e[i].next)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))#define cheak(i) printf("%d ",i)#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define inf 0x3f3f3f3f#define lowbit(x) (x&(-x))typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define maxm maxn*maxn#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])double dp[maxn][maxn];int main(){ int i,j,n,s; scanf("%d%d",&n,&s); dp[n][s]=0; lfor(i,n,0) { lfor(j,s,0) { if(i==n&&j==s) continue; double x=n*s*1.0,y=i*j*1.0; //dp[i][j]=(1+dp[i+1][j]*(n-i)*j/x+dp[i][j+1]*i*(s-j)/x+dp[i+1][j+1]*(n-i)*(s-j)/x)/(1-i*j/x); dp[i][j]=(1+dp[i+1][j]*(1.0-f(i)/f(n))*(f(j)/f(s))+dp[i][j+1]*(1.0-f(j)/f(s))*(f(i)/f(n))+dp[i+1][j+1]*(1.0-f(i)/f(n))*(1.0-f(j)/f(s)))/(1.0-y/x); } } printf("%.4f\n",dp[0][0]); return 0;}
C. ZOJ 3329 One Person Game
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))double dp[maxn],p[maxn],A[maxn],B[maxn];int main(){ int T,n,k1,k2,k3,a,b,c,i,j,k; scanf("%d",&T); while(T--) { scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); mem(dp,0);mem(p,0); double x=1.0/(1.0*k1*k2*k3); rfor(i,1,k1) rfor(j,1,k2) rfor(k,1,k3) if(i!=a||j!=b||k!=c) p[i+j+k]+=x; mem(A,0);mem(B,0); lfor(i,n,0) { rfor(j,3,k1+k2+k3) { A[i]+=p[j]*A[i+j]; B[i]+=p[j]*B[i+j]; } A[i]+=x; B[i]++; } printf("%.15lf\n",B[0]/(1-A[0])); } return 0;}
D. HDU 4405 Aeroplane chess
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 100005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))double dp[maxn];int fly[maxn];int main(){ int n,m,i,j,x,y; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; mem(fly,-1);mem(dp,0); rfor(i,1,m) { scanf("%d%d",&x,&y); fly[x]=max(fly[x],y); } double x=1.0/6.0; lfor(i,n-1,0) { if(fly[i]==-1) rfor(j,1,6) { dp[i]+=dp[i+j]*x; } else dp[i]=dp[fly[i]]; if(fly[i]==-1) dp[i]++; } printf("%.4f\n",dp[0]); } return 0;}
E. HDU 4089 Activation
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 2005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))/*1 激活失败 留在队列中等待下一次激活(概率为p1)2 失去连接 出队列 然后排在队列的最后(概率为p2)3 激活成功 离开队列(概率为p3)4 服务器瘫痪 服务器停止激活 所有人都无法激活了*//*if(j==1)dp[i][1]=dp[i][1]*p1+dp[i][i]*p2+p4;else if(j<=k)dp[i][j]=dp[i][j]*p1+dp[i][j-1]*p2+dp[i-1][j-1]*p3+p4;elsedp[i][j]=dp[i][j]*p1+dp[i][j-1]*p2+dp[i-1][j-1]*p3;*//* dp[i][j] i 个人 排在 j 1<=j<=ia=p2/(1-p1) b=p3/(1-p1) c=p4/(1-p1)if(j==1)dp[i][1]=a*dp[i][i]+c;else if(j<=k)dp[i][j]=a*dp[i][j-1]+b*dp[i-1][j-1]+c;elsedp[i][j]=a*dp[i][j-1]+b*dp[i-1][j-1]; *///dp[i][j]=sigma(dp[i][j]*a|1<=j<=i)+sigma(b*dp[i-1][j-1]+c)+j<=k?c:0;int n,m,k;double p1,p2,p3,p4,a,b,c;double dp[maxn][maxn],A[maxn];int main(){ int i,j; while(~scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)) { if(p4<(1e-10)) { printf("0.00000\n"); continue; } a=p2/(1.0-p1),b=p3/(1.0-p1),c=p4/(1.0-p1); //printf("%lf %lf %lf\n",a,b,c); dp[1][1]=(p4)/(1-p1-p2); rfor(i,2,n) { rfor(j,2,(i<=k?i:k)) A[j]=b*dp[i-1][j-1]+c; rfor(j,k+1,i) A[j]=b*dp[i-1][j-1]; double p=1,tmp=0; lfor(j,i,2) { tmp+=p*A[j]; p*=a; } dp[i][i]=(tmp+c*p)/(1.0-p*a); dp[i][1]=a*dp[i][i]+c; rfor(j,2,i-1) dp[i][j]=a*dp[i][j-1]+A[j]; } printf("%.5f\n",dp[n][m]); } return 0;}
F. HDU 4035 Maze
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 10005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))vector<int>vec[maxn];struct node{ double die,out;}A[maxn];double dp[maxn],a[maxn],b[maxn],c[maxn];int dfs(int u,int fa){ int Size=vec[u].size(),i; a[u]=A[u].die; b[u]=(1-A[u].die-A[u].out)/Size; c[u]=1-A[u].die-A[u].out; double tmp=0; rfor(i,0,Size-1) { int v=vec[u][i]; if(v!=fa) { if(!dfs(v,u)) return 0; a[u]+=(1-A[u].die-A[u].out)/f(Size)*a[v]; c[u]+=(1-A[u].die-A[u].out)/f(Size)*c[v]; tmp+=(1-A[u].die-A[u].out)/f(Size)*b[v]; } } if(fabs(tmp-1)<1e-9) return 0; a[u]/=1-tmp; b[u]/=1-tmp; c[u]/=1-tmp; return 1;}int main(){ int o=0,T,i,n,u,v; scanf("%d",&T); while(T--) { scanf("%d",&n); rfor(i,1,n) vec[i].clear(); rfor(i,1,n-1) { scanf("%d%d",&u,&v); vec[u].push_back(v); vec[v].push_back(u); } rfor(i,1,n) { scanf("%d %d",&u,&v); A[i].die=f(u)/100.0; A[i].out=f(v)/100.0; } printf("Case %d: ",++o); if(dfs(1,0)&&fabs(1-a[1])>1e-9) printf("%.6lf\n",c[1]/(1-a[1])); else printf("impossible\n"); } return 0;}
G. HDU 3853 LOOPS
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))double A[maxn][maxn],B[maxn][maxn],C[maxn][maxn];double dp[maxn][maxn];//不动 向右 向下 int main(){ int i,j,n,m; while(~scanf("%d%d",&n,&m)) { rfor(i,1,n) { rfor(j,1,m) { scanf("%lf%lf%lf",&A[i][j],&B[i][j],&C[i][j]); } } mem(dp,0); dp[n][m]=0; lfor(i,n,1) { lfor(j,m,1) { if(i==n&&j==m) continue; if(A[i][j]==1.0) continue; dp[i][j]=(dp[i+1][j]*C[i][j]+dp[i][j+1]*B[i][j]+2)/(1.0-A[i][j]); } } printf("%.3f\n",dp[1][1]); } return 0;}
H POJ 2151 Check the difficulty of problems
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))// M道题 T个队 // i队解决j道题的概率// 问冠军至少N道题&&每队AC一题概率==每队至少AC一道-每队AC都在1~N-1//每队AC概率==(1-每道题都不AC)的乘积// 每队AC一题的概率==(1-(1-p[i][j]))的乘积double A[maxn][35],dp[maxn][35][35],p[maxn][35];int main(){ int i,j,k,m,t,n; while(~scanf("%d%d%d",&m,&t,&n)) { if(m==0&&t==0&&n==0) break; rfor(i,1,t) { rfor(j,1,m) scanf("%lf",&A[i][j]); } rfor(i,1,t)//第i个队 { dp[i][0][0]=1.0; double x=1; rfor(j,1,m)//前j道题 { x*=(1-A[i][j]); dp[i][j][0]=x; rfor(k,1,n)//解出k道题 dp[i][j][k]=dp[i][j-1][k-1]*A[i][j]+dp[i][j-1][k]*(1-A[i][j]); } } /*rfor(i,1,t) { rfor(j,1,m) printf("%lf ",dp[i][m][j]); printf("\n"); }printf("\n");*/ double p1=1; rfor(i,1,t) { double x=1; rfor(j,1,m) x*=(1-A[i][j]); p1*=(1.0-x); } double p2=1; rfor(i,1,t) { double x=0; rfor(j,1,n-1) x+=dp[i][m][j]; p2*=x; } printf("%.3lf\n",p1-p2); } return 0;}
I. Codeforces 148D Bag of mice
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 1005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))double dp[maxn][maxn];int main(){ int w,b,i,j; while(~scanf("%d%d",&w,&b)) { mem(dp,0); rfor(i,1,w) dp[i][0]=1; rfor(i,1,b) dp[0][i]=0; rfor(i,1,w) { rfor(j,1,b) { dp[i][j]+=f(i)/f(i+j); if(j>=3) dp[i][j]+=f(j)/f(i+j)*f(j-1)/f(i+j-1)*f(j-2)/f(i+j-2)*dp[i][j-3]; if(i>=2) dp[i][j]+=f(j)/f(i+j)*f(j-1)/f(i+j-1)*f(i)/f(i+j-2)*dp[i-1][j-2]; } } printf("%.9f\n",dp[w][b]); } return 0;}
J .POJ 3071 Football
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 505#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))double A[maxn][maxn],dp[8][maxn];int main(){ int i,j,k,n; while(~scanf("%d",&n)&&n!=-1) { int m=1<<n; rfor(i,1,m) { rfor(j,1,m) { scanf("%lf",&A[i][j]); } } mem(dp,0); rfor(i,1,m) if(i%2) dp[1][i]=A[i][i+1]; else dp[1][i]=A[i][i-1]; rfor(i,2,n) { rfor(j,1,m) { int t=1<<i,pos=1; while(j>=t+pos) pos+=t; if(j<pos+t/2) pos+=t/2;//printf("%d %d %d\n",i,t,pos); rfor(k,pos,pos+t/2-1) dp[i][j]+=dp[i-1][k]*A[j][k]*dp[i-1][j]; } } //rfor(i,1,m) printf("%lf ",dp[n][i]);printf("\n"); int flag=1; rfor(i,2,m) if(dp[n][flag]<dp[n][i]) flag=i; printf("%d\n",flag); } return 0;}
K. SGU 495 Kids and Prizes
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 100005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))//n-n*((n-1)/n)^mint main(){ double n,m; while(~scanf("%lf%lf",&n,&m)) { double ans; ans=n-n*pow((n-1)/n,m); printf("%.9lf\n",ans); } return 0;}
M. ZOJ 3640 Help Me Escape
#include<map>#include<set>#include<queue>#include<stack>#include<math.h>#include<string>#include<vector>#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm> using namespace std;typedef long long LL;#define maxn 20005#define f(x) (x*1.0)#define inf 0x3f3f3f3f#define maxm maxn*maxn#define min(a,b) (a>b?b:a)#define max(a,b) (a>b?a:b)#define lowbit(x) (x&(-x))#define cheak(i) printf("%d ",i)#define lson(x) (splay[x].son[0])#define rson(x) (splay[x].son[1])#define rfor(i,a,b) for(i=a;i<=b;++i)#define lfor(i,a,b) for(i=a;i>=b;--i)#define mem(a,b) memset(a,b,sizeof(a))#define mec(a,b) memcpy(a,b,sizeof(b))const double tt=(1.0+sqrt(5.0))/2.0;double dp[maxn];int A[105];int main(){ int i,j,n,f; while(~scanf("%d%d",&n,&f)) { double x=f(1)/f(n); rfor(i,1,n) scanf("%d",&A[i]); sort(A+1,A+n+1); mem(dp,0); double t=0; rfor(i,1,n) { int tmp=tt*A[i]*A[i]; t+=(double)tmp*x; } rfor(i,A[n]+1,A[n]*2) dp[i]=t; lfor(i,A[n],f) { rfor(j,1,n) { if(i>A[j]) { int tmp=tt*A[j]*A[j]; t=tmp*x; dp[i]+=t; } else dp[i]+=(1+dp[i+A[j]])*x; } } printf("%.3lf\n",dp[f]); } return 0;}
0 0
- 概率DP合集
- 概率DP总结 入门12题+论文合集
- poj dp 合集
- poj dp 合集
- DP合集
- poj dp合集
- 数位DP合集
- 数位DP合集
- DP专题合集
- 区间DP合集
- POJ DP题目合集
- 概率dp
- ##概率dp##
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- JAVA中的Jar
- 图片单击放大,再次单击缩小
- 关于主线程中自动建立的Looper的思考:主线程中Looper中的轮询死循环为何没有阻塞主线程
- MongoDB_索引
- Android Studio Mac版常用技巧及快捷键
- 概率DP合集
- 安卓开发——Canvas类
- hdoj 2061 Treasure the new start, freshmen!
- Merge Two Linked List
- 配置和美化Arch Linux
- Struts2-03-OGNL表达式
- 一些感想
- ASP.NET MVC 自定义后缀路由设置
- 数据结构之B树B+树