1、B站视频链接:E39 概率DP 求概率_哔哩哔哩_bilibili
题目链接:Bag of mice - 洛谷
#include <bits/stdc++.h>
using namespace std;
int w,b;
double f[1010][1010];
int main(){
scanf("%d%d",&w,&b);
for(int i=1;i<=b;i++)f[0][i]=0;
for(int i=1;i<=w;i++)f[i][0]=1;
for(int i=1;i<=w;i++){//枚举白鼠
for(int j=1;j<=b;j++){//枚举黑鼠
f[i][j]+=(double)i/(i+j);
if(i>=1&&j>=2){//防止越界
f[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*f[i-1][j-2];
}
if(j>=3){
f[i][j]+=(double)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;
}
#include <bits/stdc++.h>
using namespace std;
double p[130][130];
double f[0][130];
int main(){
int n;
while(scanf("%d",&n),n!=-1){
int m=1<<n;//2的n次方
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
scanf("%lf",&p[i][j]);
}
}
memset(f,0,sizeof(f));
for(int i=0;i<m;i++)f[0][i]=1;//第0轮所有球队均胜
for(int i=1;i<=n;i++){//第i轮
for(int j=0;j<m;j++){//第j队
for(int k=0;k<m;k++){//对手队
if(((j>>(i-1))^1)==(k>>(i-1))){
f[i][j]+=f[i-1][j]*f[i-1][k]*p[j][k];
}
}
}
}
int ans;double mx=0;
for(int i=0;i<m;i++){
if(f[n][i]>mx)ans=i,mx=f[n][i];
}
printf("%d\n",ans+1);
}
return 0;
}