题目分析
dp[i][j]代表已达到前i和前j,以此为起始到达n、s的期望。
此时,有
pi1=in
的概率再次选择前i个,
qj1=js
的概率再次选择前j个,
pi2=n−in
的概率选择后面n-i个中的一个,
qj2=s−js
的概率选择后面s-j个中的一个。则
dpij=pi1qj1dpij+pi1qj2dpi(j+1)+pi2qj1dp(i+1)j+pi2qj2dp(i+1)(j+1)+1
“+1”要放在外面,而非等式右边每个的dp上。(占坑日后解释)
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
const double eps=1e-9;
const int maxn = 1003;
int n,s;
double ji;
double dp[maxn][maxn];
int main()
{
while(cin>>n>>s)
{
ji=n*s;
dp[n][s]=0;
for(int i=n;i>=0;i--)
for(int j=s;j>=0;j--)
{
if(i==n && j==s) continue;
double x,y;
x=1-i*j/ji;
y=1;
if(i+1<=n) y+=(n-i)*j/ji*dp[i+1][j];
if(j+1<=s) y+=i*(s-j)/ji*dp[i][j+1];
if(i+1<=n && j+1<=s) y+=(n-i)*(s-j)/ji*dp[i+1][j+1];
dp[i][j]=y/x;
}
printf("%.4f\n",dp[0][0]);
}
return 0;
}