ZOJ 3329 One Person Game (经典概率dp+有环方程求解)
2017-08-29 17:43
363 查看
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329
题意:
现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki。每次扔骰子,如果这三个骰子的值分别对应为a,b,c,那么将值初始化为0,否则就将三个骰子的点值和相加。求大于等于n的扔骰子次数期望。
思路:
这道题目主要在于推公式,看着别人的题解想了好久。
先设$E(i)$为此时和为i时还需要的期望,易得(1):$E(i)=\sum (E(i+k)P(k))+E(0)P(0)+1$(这里$P(k)$为点值和为k的概率,$P(0)$就是对应a,b,c的概率)。
现在我们要求解的是$E(0)$,而且发现每个式子中都会包含$E(0)$。
当遇到这样的情况时我们可以先假设一下,假设(2):$E(i)=A(i)E(0)+B(i)$,那么(3):$E(i+k)=A(i+k)E(0)+B(i+k)$。
将(3)式带入(1)式,得(4):$E(i)=(\sum (A(i+k)P(k))+P(0))*E(0)+\sum (B(i+k)P(k))+1$。
将(2)式和(4)式作比较,可得:
(5):$A(i)=\sum (A(i+k)P(k))+P(0)$
(6):$B(i)=\sum (B(i+k)P(k))+1$
而由(2)式我们又可以推出$E(0)=\frac{B(0)}{1-A(0)}$。
所以现在要的就是A(0)和B(0)的值,这个很简单,由(5)、(6)递推得到即可。
题意:
现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki。每次扔骰子,如果这三个骰子的值分别对应为a,b,c,那么将值初始化为0,否则就将三个骰子的点值和相加。求大于等于n的扔骰子次数期望。
思路:
这道题目主要在于推公式,看着别人的题解想了好久。
先设$E(i)$为此时和为i时还需要的期望,易得(1):$E(i)=\sum (E(i+k)P(k))+E(0)P(0)+1$(这里$P(k)$为点值和为k的概率,$P(0)$就是对应a,b,c的概率)。
现在我们要求解的是$E(0)$,而且发现每个式子中都会包含$E(0)$。
当遇到这样的情况时我们可以先假设一下,假设(2):$E(i)=A(i)E(0)+B(i)$,那么(3):$E(i+k)=A(i+k)E(0)+B(i+k)$。
将(3)式带入(1)式,得(4):$E(i)=(\sum (A(i+k)P(k))+P(0))*E(0)+\sum (B(i+k)P(k))+1$。
将(2)式和(4)式作比较,可得:
(5):$A(i)=\sum (A(i+k)P(k))+P(0)$
(6):$B(i)=\sum (B(i+k)P(k))+1$
而由(2)式我们又可以推出$E(0)=\frac{B(0)}{1-A(0)}$。
所以现在要的就是A(0)和B(0)的值,这个很简单,由(5)、(6)递推得到即可。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> #include<stack> #include<queue> #include<cmath> #include<map> #include<set> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int maxn=500+5; int n,k1,k2,k3,a,b,c; double p0; double A[maxn],B[maxn],p[maxn]; int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); while(T--) { cin>>n>>k1>>k2>>k3>>a>>b>>c; memset(p,0,sizeof(p)); p0=1.0/k1/k2/k3; for(int i=1;i<=k1;i++) for(int j=1;j<=k2;j++) for(int t=1;t<=k3;t++) { if(i==a && j==b && t==c) continue; p[i+j+t]+=p0; } for(int i=n;i>=0;i--) { A[i]=p0,B[i]=1; for(int t=3;t<=k1+k2+k3;t++) { if(i+t>n) continue; A[i]+=A[i+t]*p[t]; B[i]+=B[i+t]*p[t]; } } printf("%.16f\n",B[0]/(1-A[0])); } return 0; }
相关文章推荐
- ZOJ 3329 One Person Game——(概率DP+待定系数求解方程)
- ZOJ 3329 One Person Game(概率dp 经典)
- ZOJ 3329 One Person Game 概率dp
- zoj 3329 One Person Game (概率DP )
- ZOJ 3329 One Person Game 概率dp 处理环
- zoj 3329 One Person Game 概率dp
- ZOJ 3329 One Person Game (概率DP)
- ZOJ 3329 One Person Game(概率DP)
- ZOJ 3329 One Person Game(概率DP,求期望)★
- zoj 3329 One Person Game (概率DP )
- ZOJ 3329 One Person Game 【概率DP,求期望】
- zoj 3329 One Person Game <概率DP>
- zoj 3329 One Person Game(概率DP基础)
- ZOJ - 3329 One Person Game(概率dp)
- ZOJ 3329 One Person Game(概率DP)
- zoj 3329 One Person Game 概率dp
- ZOJ 3329 One Person Game(概率DP,求期望)
- zoj 3329 One Person Game(概率dp)
- ZOJ 3329 One Person Game 带环的概率DP
- ZOJ-3329 One Person Game (概率DP)