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(); }