将对几个的概率记录下来,然后依次递推
#include <cstdio>
#include <cstring>
int n;
double dp[2][20];
void solve()
{
char str[20];
memset(dp, 0, sizeof(dp));
int i, j, k, wc, kc;
wc = kc = 0;
dp[0][n] = 1;
int now = 0, next = 1;
while (true)
{
scanf("%s", str);
if (str[0] == 'E') break;
for (i = 0; i <= n; ++i)
{
j = n - i;
if (str[0] == 'W')
{
if (wc >= n) break;
if (i > 0) dp[next][i - 1] += dp[now][i] * i / (n - wc);
dp[next][i] += dp[now][i] * (j - wc) / (n - wc);
}
else if (str[0] == 'K')
{
if (kc >= n) break;
if (j > 0) dp[next][i + 1] += dp[now][i] * j / (n - kc);
dp[next][i] += dp[now][i] * (i - kc) / (n - kc);
}
}
if (i != n + 1) continue;
if (str[0] == 'W') {wc++; kc = 0;}
else if (str[0] == 'K') {kc++; wc = 0;}
// for (i = 0; i <= n; ++i)
// printf("%.2f ", dp[next][i]);
// printf("\n");
now ^= 1; next ^= 1;
memset(dp[next], 0, sizeof(dp[next]));
}
printf("%.2lf\n", dp[now][n]);
}
int main()
{
while (scanf("%d", &n) != EOF)
{
solve();
}
return 0;
}