3 条题解

  • 2
    @ 2025-12-14 9:33:08

    看的出来,目前没有正常题解,发一个简单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
    @ 2025-10-8 16:50:43

    E39 概率DP 求概率

    状态: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
      @ 2025-10-8 16:50:59

      E39 概率DP 求概率

      状态: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]+=j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*f[i-1][j-2]

      3. 先手黑鼠,后手黑鼠,跑黑鼠: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

      E39*【概率DP:求概率】抓老鼠[CF148D] Bag of mice

      信息

      ID
      497
      时间
      1000ms
      内存
      128MiB
      难度
      4
      标签
      递交数
      73
      已通过
      32
      上传者