期望,$dp$。
设$dp[i][j]$表示还剩下$i$只老虎,$j$只鹿的情况下,到达目标状态的期望概率。$dp[0][X]$均为$1$。因为人碰到鹿可以选择杀或者不杀,两种情况都算一下,取个$max$即可。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-6; void File() { freopen("D:\in.txt","r",stdin); freopen("D:\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c = getchar(); x = 0; while(!isdigit(c)) c = getchar(); while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); } } double dp[1005][1005]; int t,d; int main() { int T; scanf("%d",&T); int cas=1; while(T--) { scanf("%d%d",&t,&d); memset(dp,0,sizeof dp); for(int i=0;i<=d;i++) dp[0][i]=1; for(int i=1;i<=t;i++) { for(int j=0;j<=d;j++) { double ans1=0,ans2=0; if(j>=1) ans1+=1.0*i*j*dp[i][j-1]; if(j>=1) ans1+=1.0*j*dp[i][j-1]; if(i>=2) ans1+=1.0*i*(i-1)/2*dp[i-2][j]; ans1=ans1/((i+j+1)*(i+j)/2-j*(j-1)/2); if(j>=1) ans2+=1.0*i*j*dp[i][j-1]; if(i>=2) ans2+=1.0*i*(i-1)/2*dp[i-2][j]; ans2=ans2/((i+j+1)*(i+j)/2-j*(j-1)/2-j); dp[i][j]=max(ans1,ans2); } } printf("Case %d: %lf ",cas++,dp[t][d]); } return 0; }