Problem B
Winning Streak
Input: Standard Input
Output: Standard Output
"You can run on for a long time,
sooner or later God'll cut you down."
– Traditional folk song
Mikael likes to gamble, and as you know, you can place bets on almost anything these days. A particular thing that has recently caughtMikael's interest is the length of the longest winning streak of a team during a season (i.e. the highest number of consecutive games won). In order to be able to make smarter bets, Mikael has asked you to write a program to help him compute the expected value of the longest winning streak of his favourite teams.
In general, the probability that a team wins a game depends on a lot of different factors, such as whether they're the home team, whether some key player is injured, and so on. For the first prototype of the program, however, we simplify this, and assume that all games have the same fixed probability p of being won, and that the result of a game does not affect the win probability for subsequent games.
The expected value of the longest streak is the average of the longest streak in all possible outcomes of all games in a season, weighted by their probability. For instance, assume that the season consists of only three games, and that p = 0.4. There are eight different outcomes, which we can represent by a string of 'W':s and 'L':s, indicating which games were won and which games were lost (for example, 'WLW' indicates that the team won the first and the third game, but lost the second). The possible results of the season are:
Result |
LLL |
LLW |
LWL |
LWW |
WLL |
WLW |
WWL |
WWW |
Probability |
0.216 |
0.144 |
0.144 |
0.096 |
0.144 |
0.096 |
0.096 |
0.064 |
Streak |
0 |
1 |
1 |
2 |
1 |
1 |
2 |
3 |
In this case, the expected length of the longest winning streak becomes 0.216·0 + 0.144·1 + 0.144·1 + 0.096·2 + 0.144·1 + 0.096·1 + 0.096·2 + 0.064·3 = 1.104
Input
Several test cases (at most 40), each containing an integer 1 ≤ n ≤ 500 giving the number of games in a season, and a floating point number 0 ≤ p ≤ 1, the win probability. Input is terminated by a case where n = 0, which should not be processed.
For each test case, give the expected length of the longest winning streak. The answer should be given as a floating point number with an absolute error of at most 10-4.
3 0.4 10 0.75 0 0.5
|
1.104000 5.068090
|
题意:比n次,赢得概率p,求连续赢的期望。
思路:没想出思路,后来问了小伙伴, dp[i][j]表示的是第i次,连续赢的次数不超过j的所有情况的概率。如此以来 dp[i][j] = dp[i - 1][j]在扣掉不是该状态的情况的概率,即为多赢了一盘之后连续的情况超过j的情况,该情况只在末尾有j个连续赢的情况出现,所以要扣掉dp[i][j] = dp[i - 1][j] - dp[i - 1 - j - 1][j] * P. 要注意。有一种特殊的就是整条都是赢的要单独出来考虑。
代码:
#include <stdio.h> #include <string.h> const int N = 505; int n; double p; double P[N]; double dp[N][N]; void init() { memset(dp, 0, sizeof(dp)); P[0] = 1; for (int i = 0; i <= n; i ++) dp[0][i] = 1; for (int i = 1; i <= n; i ++) P[i] = P[i - 1] * p; } void solve() { init(); double ans = 0; for (int i = 1; i <= n; i++) { for (int j = 0; j <= n; j++) { dp[i][j] = dp[i - 1][j]; if (j == i - 1) dp[i][j] -= P[j + 1]; else if (j < i - 1) dp[i][j] -= dp[i - 2 - j][j] * (1 - p) * P[j + 1]; } for (int i = 1; i <= n; i ++) ans += i * (dp[n][i] - dp[n][i - 1]); } printf("%.6lf\n", ans); } int main() { while (~scanf("%d%lf", &n, &p) && n) { solve(); } return 0; }