概率专题·期望
来源:互联网 发布:ubuntu 安装打印机 编辑:程序博客网 时间:2024/04/30 04:51
- uva 11021 Tribbles
- UVA 11722 Joining with Friend
- UVA 11427 Expect the Expected
- UVA 11762 Race to 1
- UVA 10491 So you want to be a 2n-aire
- UVA 11346 Probability
- UVA 11637 Garbage Remembering Exam
- UVA 11605 Lights inside a 3d Grid
- UVA 10491 Cows and Cars
- UVA 1413 Game
- UVA 1498 Activation
uva 11021 Tribbles
k只麻球,每活一天就会死亡,但第二天可能会生一些麻球,具体说来,生i个麻球的概率为pi ,求m天后所有麻球都死亡的概率
#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<functional>#include<iostream>#include<cmath>#include<cctype>#include<ctime>#include<iomanip> using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p]) #define Lson (x<<1)#define Rson ((x<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair#define fi first#define se second#define vi vector<int> typedef long long ll;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} #define MAXN (1000+10)int T,n,k,m;double p[MAXN],f[MAXN];int main(){// freopen("uva11021.in","r",stdin);// freopen(".out","w",stdout); T=read(); For(kcase,T) { n=read(),k=read(),m=read(); Rep(i,n) cin>>p[i]; f[0]=0; f[1]=p[0]; Fork(i,2,m) { f[i]=0; Rep(j,n) f[i]+=p[j]*pow(f[i-1],j); } printf("Case #%d: %.7lf\n",kcase,pow(f[m],k)); } return 0;}
UVA 11722 Joining with Friend
题意:假设你会在时间区间[t1,t2]中的任意时刻以相同的概率到达火车站,你朋友则在[s1,s2]中的任意时刻以相同的概率到达火车站,你们在到达后停留w分钟,问你们会面的概率。若存在一个时刻你们同时在火车站视为一定会面。
题解:概率空间是坐标系中的一个矩形,分情况讨论算面积。
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} ld t1,t2,s1,s2,w;int main(){// freopen("uva11722.in","r",stdin);// freopen(".out","w",stdout); int T=read(); For(kcase,T) { cin>>t1>>t2>>s1>>s2>>w; if (s2-t2>s1-t1) swap(t1,s1),swap(t2,s2); ld a[5]={0,s1-t2,s2-t2,s1-t1,s2-t1}; ld S=(t2-t1)*(s2-s1),p=0; if (-w<a[1]) { } else if (-w<a[2]) { p+=pow(t2-w-s1,2)/2; } else if (-w<a[3]) { p+=(t2-s1-w+t2-s2-w)*(s2-s1)/2; } else if (-w<a[4]) { p+=S-pow(s2+w-t1,2)/2; } else p+=S; if (w<a[1]) { p+=S; } else if (w<a[2]) { p+=S-(t2+w-s1)*(t2+w-s1) /2; } else if (w<a[3]) { p+=S- (t2-s1+w+t2-s2+w)*(s2-s1)/2; } else if (w<a[4]) { p+=pow(s2-w-t1,2)/2; } printf("Case #%d: ",kcase); cout<<(S-p)/S<<endl; } return 0;}
UVA 11427 Expect the Expected
题意:每天晚上你会玩牌。第一把赢了就去睡觉,输了继续。你每一把赢的概率是p,当你赢的比例严格大于p时,才会去睡觉。但是你一个晚上最多玩n把游戏,如果哪天获胜比例一直没有大于p,你以后再也不玩了。求玩游戏天数的期望。
假设单独一天获胜概率为Q
则
高中数学作差法可得
计算Q可以dp,
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} const int maxn = 100 + 10;int n;double dp[maxn][maxn];int main(){// freopen("uva11427.in","r",stdin);// freopen(".out","w",stdout); int T=read(); For(kcase,T) { int a,b; scanf("%d/%d %d",&a,&b,&n); double p=(double)a/b; MEM(dp) dp[0][0]=1; For(i,n) Rep(j,i) { if ((double)j/i>p) break; dp[i][j]=dp[i-1][j]*(1-p)+( j ? dp[i-1][j-1]*p : 0 ); } double ans=0; Rep(j,n) ans+=dp[n][j]; printf("Case #%d: %d\n",kcase,(int)(1/ans)); } return 0;}
UVA 11762 Race to 1
其实直接用马尔可夫过程就好
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} const int MAXN = (1000000+10);int primes[MAXN],size=0;bool b[MAXN]={0};void make_prime() { int n=MAXN-10; Fork(i,2,n) { if (!b[i]) primes[++size]=i; For(j,size) { if (i*primes[j]>n) break; b[i*primes[j]]=1; if (i%primes[j]==0) break; } }}double dp[MAXN]={0};bool vis[MAXN]={0,1};double calc(int x) { if (vis[x]) return dp[x]; dp[x]=1; int siz=0,t=0; double c=0; for(int i=1;primes[i]<=x&&i<=size;++i) { ++siz; if (x%primes[i]==0) ++t,c+=calc(x/primes[i]); } return dp[x] = (c+siz)/t; }int main(){// freopen("uva11762.in","r",stdin);// freopen(".out","w",stdout); make_prime(); int T=read(); For(kcase,T) { double ans=calc(read()); printf("Case %d: %.8lf\n",kcase,ans); } return 0;}
UVA 10491 So you want to be a 2n-aire?
很容易搞错的是,每次拿到题目后’我’马上知道答对概率,要根据这个概率决策的。
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define eps (1e-9)#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} int n;double t,p,dp[50];void work() { dp[n]=(ll)1<<(ll)n; if (fabs(1-t)<eps) { cout<<dp[n]<<endl; return; } RepD(i,n-1) { double p2=((ll)(1<<(ll)i)); double f=p2 / dp[i+1]; if (f<=t) dp[i]=p*dp[i+1]; else dp[i] = ( (f-t)*p2 + (1-f)*(f+1) /2*dp[i+1] ) / (1-t); } cout<<dp[0]<<endl;}int main(){// freopen("uva10900.in","r",stdin);// freopen(".out","w",stdout); cout<<setiosflags(ios::fixed)<<setprecision(3); while(cin>>n>>t && n) { p=(1+t)/2; work(); } return 0;}
UVA 11346 Probability
积分求面积,SB题
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} int main(){// freopen("uva11346.in","r",stdin); int T=read(); double a,b,S; while(cin>>a>>b>>S) { if (a*b<=S) { puts("0.000000%"); } else if (S<1e-7) { puts("100.000000%"); }else { printf("%.6lf%\n",100-(1+log(a)-log(S/b))*S/a/b*100); } } return 0;}
UVA 11637 Garbage Remembering Exam
期望具有线性性质,原题可以拆成每个单词无效无效概率的和,取反计算有效概率,线状排列中与第i个有效的概率为与在线排列中其所有距离不超过k的在都在环中超过k个的概率,暴力统计
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} const int MAXN = 100000 + 10;int k,n;double p[MAXN];double solve(int n,int k) {// {2*k+1..n-1-2k} MEM(p) int x=2*k+1; p[n]=1; For(i,2*k) { p[n]=p[n]*(n-2*k+i)/(n-2*k-1+i); } ForkD(X,x,n) { p[X-1]=p[X]*(X-2*k)/X; } double ans=0; For(i,n) { int len=n-(min(i+k,n)-max(i-k,1)+1); ans+=1-p[len]; } return ans;}int main(){// freopen("uva11637.in","r",stdin);// freopen(".out","w",stdout); int kcase=1; while (cin>>n>>k && n && k) { double ans=0; if (n==1) ans=0; else if (n-1-2*k>0) { ans=solve(n,k); } else { ans=n; } printf("Case %d: %.4lf\n",kcase++,ans); } return 0;}
UVA 11605 Lights inside a 3d Grid
用线性期望转成所有灯开的概率,由于这题是用xor和
根据
可以求出
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} int M,N,P,K;void calc(int i,int j,int k) {}int main(){// freopen("uva11605.in","r",stdin);// freopen(".out","w",stdout); int T=read(); For(kcase,T) { double ans=0; cin>>N>>M>>P>>K; For(i,N) For(j,M) For(k,P) { double p=(2.0*i*(N-i+1)-1)*(2*j*(M-j+1)-1)*(2*k*(P-k+1)-1)/(double)N/N/M/M/P/P; ans+=1-pow(1.0-2*p,K); } printf("Case %d: %.10lf\n",kcase,ans/2); } return 0;}
UVA 10491 Cows and Cars
注意所有门是一次打开的
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} int main(){// freopen("uva11181.in","r",stdin);// freopen(".out","w",stdout); double a,b,c; while(cin>>a>>b>>c) { cout<<setiosflags(ios::fixed)<<setprecision(5); cout<< (a*b+b*(b-1))/(a+b)/(a+b-c-1)<<endl; } return 0;}
UVA 1413 Game
卡精度问题,首先可以用区间dp算出一个某个区间的某侧人拿球时传左,右的概率,然后考虑第k个人拿球时,出现某个区间某侧人拿球的期望,只要n-1个人拿球了,后面无论如何都是n赢
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} const int MAXN = 50 +10;int n,k;double p[MAXN]; const int L = 0, R = 1;ld f[MAXN][MAXN][2][2]; // [left,Right,Ball,Excepted Direction]ld dp[MAXN][MAXN][2]; // P[Left,Right,Excepted Direction]int main(){// freopen("uva1413.in","r",stdin);// freopen(".out","w",stdout); while(scanf("%d%d",&n,&k)==2) { MEM(p) MEM(f) MEM(dp) For(i,n-1) scanf("%lf",&p[i]); For(i,n-1) { f[i][i][L][L]=f[i][i][R][L]= 1 - p[i]; f[i][i][L][R]=f[i][i][R][R]= p[i]; } // 用等比数列算出的公式 :在区间[I,J],球在k端时,从l端出去的概率 For(d,n) { For(i,n-d-1) { int j=i+d; f[i][j][L][L]= (1-p[i]) / ( 1 - p[i] + p[i]*f[i+1][j][L][R] ); f[i][j][L][R]= p[i]*f[i+1][j][L][R] / ( 1 - p[i] + p[i]*f[i+1][j][L][R] ); //如果直接用上面的概率减会卡精度 f[i][j][R][R]= (p[j]) / ( p[j] + (1 - p[j]) * f[i][j-1][R][L] ); f[i][j][R][L]= ( (1 - p[j]) * f[i][j-1][R][L]) / ( p[j] + (1 - p[j]) * f[i][j-1][R][L] ); } } // 在区间[I,J],球在k端的概率 dp[k][k][R]=1; For(d,n-1) { For(i,n-d-1) { int j=i+d; dp[i][j][L] = dp[i+1][j][L] * f[i+1][j][L][L] + dp[i+1][j][R] * f[i+1][j][R][L]; dp[i][j][R] = dp[i][j-1][L] * f[i][j-1][L][R] + dp[i][j-1][R] * f[i][j-1][R][R]; } } double ans = dp[1][n-1][L] + dp[1][n-1][R]; cout<<setiosflags(ios::fixed)<<setprecision(10); cout<<ans<<endl; } return 0;}
UVA 1498 Activation
排队,注意各种特判,
#include<bits/stdc++.h>using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=Pre[x];p;p=Next[p])#define Forpiter(x) for(int &p=iter[x];p;p=Next[p]) #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define pb push_back#define mp make_pair #define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())typedef long long ll;typedef unsigned long long ull;ll mul(ll a,ll b){return (a*b)%F;}ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return (a-b+llabs(a-b)/F*F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}int read(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();} while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();} return x*f;} const int MAXN = (2000+10); int N,M,K;double p1,p2,p3,p4;double f[MAXN][MAXN]; void prework() { For(i,N) { double k=p2/(1-p1); f[i][i]=0; double k2=pow(k,i-1),b2=0; Fork(j,2,i) b2=b2*k+(p3*f[i-1][j-1]+p4 * (bool)(j<=K) )/ (1-p1); f[i][i]= (k2 * p4 / (1-p1) + b2 ) / ( 1 - k2 * p2 / (1 - p1) ) ; f[i][1]=( p2 * f[i][i] + p4 ) / ( 1 - p1 ); Fork(j,2,i-1) { f[i][j] = (p2 * f[i][j-1] + p3 * f[i-1][j-1] + p4 * (j<=K) ) / (1-p1) ; } }}int main(){// freopen("uva1498.in","r",stdin);// freopen(".out","w",stdout); while(cin>>N>>M>>K) { cin>>p1>>p2>>p3>>p4; if (p3 == 0 && p4 == 0 || p1 == 1 || p3 == 1 || p2 == 1 ) { puts("0.00000"); continue; } MEM(f) prework(); cout<<setiosflags(ios::fixed)<<setprecision(5); cout<<f[N][M]<<endl; } return 0;}
- 概率专题·期望
- 【专题总结】概率&期望DP
- 动态规划之概率(期望) DP专题
- 【专题总结】概率与期望(持续更新)
- 概率 期望
- 期望概率
- 期望/概率问题
- hdu 4586 (概率+期望)
- 概率dp 求期望
- 概率&期望(存档)
- 概率和期望
- LightOJ 1038 概率期望
- Hdu 5570 概率期望
- 概率与期望
- 关于概率期望
- 概率期望相关
- 各种期望与概率
- hdu4405 概率期望
- 常用的sql语句
- delete释放new[]造成的泄漏
- 如何成为顶级技术巨匠?
- ACM、蓝桥杯等程序竞赛中的一些经验-0
- POJ 3262 Protecting the Flowers(贪心,需要小小优化一下)
- 概率专题·期望
- 嵌入式STMFD SP!,{R0-R7,LR}分析
- Matlab笔记-0
- C语言 数组长度...int length = sizeof(stu) / sizeof(stu[0]);
- 学校里的那首歌
- java温习笔记01:环境配置及编辑器设置
- [c语言]EmailAddresses(for hw)
- 黑马程序员——阶乘的两种实现方法及水仙花数的打印
- 【前端】JS