3 条题解
-
2
看的出来,目前没有正常题解,发一个简单DP
#include<bits/stdc++.h> using namespace std; const int N=1100; double f[N][N];//f[i][j] 剩i白j黑 A赢 int w,b; int main() { scanf("%d%d",&w,&b); f[0][0]=0; for(int i=1;i<=1000;i++)f[0][i]=0,f[i][0]=1;//初始化 for(int i=1;i<=w;i++)for(int j=1;j<=b;j++) { f[i][j]=1.0*i/(i+j); //直接抓白 if(j>=2)f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*f[i-1][j-2]; //边界 抓黑 抓黑 跑白 上一次 if(j>=3)f[i][j]+=1.0*j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*f[i][j-3]; //边界 抓黑 抓黑 跑黑 上一次 } printf("%.9lf\n",f[w][b]); return 0; } -
0
状态:f[i][j]表示袋中有i只白鼠j只黑鼠时,A获胜的概率
起点:f[0][i]=0,f[i][0]=1
终点:f[w][b]
转移:
1.先手拿到白鼠:f[i][j]+=i/(i+j)
2.先手黑鼠,后手白鼠:f[i][j]+=0, 这种情况不用处理
3.先手黑鼠,后手黑鼠,跑白鼠:f[i][j]+=j/(i+j) *(j-1)/(i+j-1) *i/(i+j-2) *f[i-1][j-2]
4.先手黑鼠,后手黑鼠,跑黑鼠:f[i][j]+=j/(i+j) *(j-1)/(i+j-1) *(j-2)/(i+j-2) *f[i][j-3]
#include<bits/stdc++.h>
using namespace std; double f[1001][1001]; int main() { int w,b;scanf("%d%d",&w,&b); f[0][0]=0; for(int i=1;i<=1000;i++) f[0][i]=0,f[i][0]=1; for(int i=1;i<=w;i++)for(int j=1;j<=b;j++) { f[i][j]=0; f[i][j]+=1.0i/(i+j); if(j>=2)f[i][j]+=1.0j/(i+j)(j-1)/(i+j-1)i/(i+j-2)f[i-1][j-2]; if(j>=3)f[i][j]+=1.0j/(i+j)(j-1)/(i+j-1)(j-2)/(i+j-2)*f[i][j-3]; } printf("%.9lf\n",f[w][b]); return 0; }
-
-1
状态:f[i][j]表示袋中有i只白鼠j只黑鼠时,A获胜的概率
起点:f[0][i]=0,f[i][0]=1
终点:f[w][b]
转移:
-
先手拿到白鼠:f[i][j]+=i/(i+j)
-
先手黑鼠,后手黑鼠,跑白鼠:f[i][j]+=j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*f[i-1][j-2]
-
先手黑鼠,后手黑鼠,跑黑鼠:f[i][j]+=j/(i+j)(j-1)/(i+j-1)(j-2)/(i+j-2)*f[i][j-3]
#include<bits/stdc++.h> using namespace std; double f[1001][1001]; int main() { int w, b;scanf("%d%d", &w, &b); f[0][0] = 0; for(int i=1; i<=1000; i++) f[0][i] = 0, f[i][0] = 1; for(int i=1; i<=w; i++)for(int j=1; j<=b; j++) { f[i][j] = 0; f[i][j] += 1.0 * i / (i + j); if(j >= 2) f[i][j] += 1.0 * j / (i + j) * (j - 1) / (i + j - 1) * i / (i + j - 2) * f[i - 1][j - 2]; if(j >= 3) f[i][j] += 1.0 * j / (i + j) * (j - 1) / (i + j - 1) * (j - -
- 1
信息
- ID
- 497
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 73
- 已通过
- 32
- 上传者