题解:
f ( i , j ) f(i,j) f(i,j)定义为前i个人,被抵消掉过后还剩j个人向右看。求出来过后的期望乘以2就行了。
#include <bits/stdc++.h>
using namespace std;
int n,m,k;
const int N=1e5+10;
int dp[2010][2010];
void solve()
{
memset(dp,0,sizeof(dp));
int n;
scanf("%d", &n);
dp[0][0]=1;
for(int i=0;i<=n;i++) {
for (int j = 0; j <= i; j++) {
if (j) dp[i + 1][j + 1] += dp[i][j] * 0.5, dp[i + 1][j - 1] += dp[i][j] * 0.5;
else dp[i + 1][1] += dp[i][j] * 0.5, dp[i + 1][0] = dp[i][j] * 0.5;
}
}
double ans=0;
for(int i=1;i<=n;i++){
ans+=i*dp[n][i];
}
printf("%.3f\n",ans*2);
}
signed main()
{
solve();
}