题意:
有n场比赛,每场赢的概率是p,问连续赢的期望值
思路:
f[i][j]表示的是第i次,连续赢的次数不超过j的所有情况的概率。如此以来 f[i][j] = f[i - 1][j]在扣掉不是该状态的情况的概率,即为多赢了一盘之后连续的情况超过j的情况,该情况只在末尾有j个连续赢的情况出现,所以要扣掉f[i][j] = f[i - 1][j] - f[i - 1 - j - 1][j] * p;
AC:
#include<cstdio>
#include<cstring>
const int N = 505;
int n;
double p,a[N],f[N][N];
void solve(){
int i,j;
for(i = 0; i <= n; i++)
f[0][i] = 1;
for(i = 1; i <= n; i++)
for(j = 0; j <= n; j++){
f[i][j] = f[i - 1][j];
if(i - j == 1)
f[i][j] -= a[i];
else if(j + 1 <i)
f[i][j] -= a[j + 1] * (1 - p) * f[i - j - 2][j];
}
}
int main(){
while(scanf("%d%lf",&n,&p) && n){
double ans = 0;
a[0] = 1;
for(int i = 1; i <= n; i++)
a[i] = a[i - 1] * p;
solve();
for(int i = 1; i <= n; i++)
ans += (f[n][i] - f[n][i - 1]) * i;
printf("%.6lf\n",ans);
}
return 0;
}