题目地址
数据好像有些问题。
官方的地址有点难找。
法1
dp[i][j] 表示 A赢差i次B赢差j次 A赢得概率,输出dp[n][n]
故有状态转移方程为 dp[i][j] = dp[i-1][j] * p + dp[i][j-1] * (1-p)
A赢差i次B赢差j次的A赢概率为 A赢差i-1次且B赢差j次并且这次A赢 + …
代码:
int n; cin>>n>>p;
for(int i=1;i<=n;i++){
dp[i][0] = 0;
dp[0][i] = 1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j] = dp[i-1][j]*p + dp[i][j-1]*(1-p);
cout<<dp[n-3][n-3]<<endl; // 正解是dp[n][n]
法2
设 dp[i][j] 表示 打了i场,且赢了j场。最后求一个dp[n~n+n-1][n] 得sum
转移方程 : dp[i][j] = dp[i-1][j]p + dp[i][j-1](1-p)
if(j == 0) dp[i][j] = dp[i][j]*(1-p);
表示 打了i场且赢了j场 由打了 i-1场 且 赢了 j-1 场 这场赢了 + …
代码:
int n; cin>>n>>p;
dp[0][0] = 1;
n -= 3; // 题的问题
for(int i=1;i<n+n;i++)
for(int j=0;j<=min(i,n);j++)
if(j == 0) dp[i][j] = dp[i][j]*(1-p);
else dp[i][j] = dp[i-1][j-1]*p + dp[i-1][j]*(1-p);
double sum = 0;
for(int i=n;i<n+n;i++) sum += dp[i][n];
cout<<sum<<endl;