日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

發(fā)布時(shí)間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 2096 , zoj 3329 , hdu 4035 —— 期望DP 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:http://poj.org/problem?id=2096

題目好長(zhǎng)...意思就是每次出現(xiàn) x 和 y,問(wèn)期望幾次 x 集齊 n 種,y 集齊 s 種;

所以設(shè) f[i][j] 表示已經(jīng)有幾種,轉(zhuǎn)移一下即可。

代碼如下:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double db; int const xn=1005; int n,s; db f[xn][xn]; int main() {scanf("%d%d",&n,&s);for(int i=n;i>=0;i--)for(int j=s;j>=0;j--){if(i==n&&j==s)continue;db p0=1.0*i/n*j/s,p1=1.0*(n-i)/n*j/s,p2=1.0*i/n*(s-j)/s,p3=1.0*(n-i)/n*(s-j)/s;f[i][j]=p1*f[i+1][j]+p2*f[i][j+1]+p3*f[i+1][j+1]+1;f[i][j]=f[i][j]/(1-p0);}printf("%.6f\n",f[0][0]);return 0; } View Code

?

題目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754

帶環(huán)的期望DP,本來(lái)用高斯消元可以做,但 n^3 * T 過(guò)不了;

發(fā)現(xiàn)每個(gè)狀態(tài)都有到 f[0] 的轉(zhuǎn)移,所以設(shè) f[i] = A[i] * f[0] + B[i] (套路!)

然后把遞推式子代入一番,得到 A[i] 和 B[i] 的轉(zhuǎn)移是無(wú)環(huán)的,求出 A[0], B[0] 即可。

代碼如下:

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double db; int rd() {int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret; } int const xn=550; int n,f[xn]; db p[20],A[xn],B[xn]; int main() {int T=rd();while(T--){n=rd(); int k1=rd(),k2=rd(),k3=rd(),a=rd(),b=rd(),c=rd(),sum=k1+k2+k3;for(int i=0;i<=sum;i++)p[i]=0;p[0]=1.0/(k1*k2*k3);for(int i=1;i<=k1;i++)for(int j=1;j<=k2;j++)for(int k=1;k<=k3;k++)if(i!=a||j!=b||k!=c)p[i+j+k]+=p[0];for(int i=0;i<=n+sum;i++)A[i]=0,B[i]=0;for(int i=n;i>=0;i--){for(int k=3;k<=sum;k++)A[i]+=p[k]*A[i+k],B[i]+=p[k]*B[i+k];A[i]+=p[0]; B[i]+=1;}printf("%.10f\n",B[0]/(1-A[0]));}return 0; } View Code

?

題目:http://acm.hdu.edu.cn/showproblem.php?pid=4035

樹上帶環(huán)!同樣可以高斯消元,但復(fù)雜度不行;

設(shè) \( f[x] \) 表示在 x 這個(gè)點(diǎn)距離結(jié)束的期望,\( P[x] = 1 - K[x] - E[x] \),\( d[x] \) 為度數(shù),得到樸素方程:

\( f[x] = K[x] * f[1] + \frac{P[x]}{d[x]}(f[fa]+1) + \frac{P[x]}{d[x]}\sum\limits_{v \in son}(f[v]+1) \)

由于轉(zhuǎn)移的順序?qū)嶋H上應(yīng)該是從 \( fa \) 到 \( x \),又因?yàn)槊總€(gè)點(diǎn)都和 \( 1 \) 組成環(huán)(或者因?yàn)樽詈笠?\( f[1] \) ?),所以設(shè) \( f[x] = A[x]f[1] + B[x]f[fa] + C[x] \)

于是可以樹形DP得到 \( A[x], B[x], C[x] \)

\( f[1] = \frac{C[1]}{1-A[1]} \),當(dāng) \( A[1] \) 趨近于 1 時(shí)無(wú)解;

eps 設(shè)成 1e-8 會(huì) WA,1e-10 才可以。

代碼如下:

#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define eps 1e-10 using namespace std; typedef double db; int rd() {int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return f?ret:-ret; } int const xn=10005; int n,hd[xn],ct,to[xn<<1],nxt[xn<<1],d[xn]; db K[xn],E[xn],P[xn],A[xn],B[xn],C[xn]; void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;} void dfs(int x,int fa) {db as=0,bs=0,cs=0;for(int i=hd[x],u;i;i=nxt[i]){if((u=to[i])==fa)continue;dfs(u,x);as+=A[u]; bs+=B[u]; cs+=C[u];}A[x]=(d[x]*K[x]+P[x]*as)/(d[x]-P[x]*bs);B[x]=P[x]/(d[x]-P[x]*bs);C[x]=(P[x]*cs+d[x]*P[x])/(d[x]-P[x]*bs); } int main() {int T=rd(),cnt=0;while(T--){cnt++; n=rd(); ct=0; memset(hd,0,sizeof hd); memset(d,0,sizeof d);for(int i=1,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x),d[x]++,d[y]++;for(int i=1;i<=n;i++)scanf("%lf%lf",&K[i],&E[i]),K[i]/=100,E[i]/=100,P[i]=1-K[i]-E[i];for(int i=1;i<=n;i++)A[i]=B[i]=C[i]=0;dfs(1,0);printf("Case %d: ",cnt);if(fabs(A[1]-1)<eps)puts("impossible");else printf("%.8f\n",C[1]/(1-A[1]));}return 0; } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/Zinn/p/10278561.html

總結(jié)

以上是生活随笔為你收集整理的poj 2096 , zoj 3329 , hdu 4035 —— 期望DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。