题意简述
有个鱼,其中第个鱼把第个与吃掉的概率是,保证。会有轮,每一轮会等概率随机选择两个鱼来比♂拼,然后直到最后只剩下一个鱼。对于每个鱼,求最后剩下它的概率。
顺便膜鱼,鱼tql%%%
思路框架
状压。对于每个状态,枚举已有的鱼,枚举上一次被吃掉的鱼,加一下。
具体思路
设表示剩下活着的鱼状态为的概率。那么,我们在中找到一条鱼,设它为上一次获胜的。那么上一次死掉的肯定不在里面了,就到外面去找一条上一次死掉的鱼。设中包含条鱼,那么。其中表示中加入,用位运算表示为。 是选择 和出来比♂拼的概率,是把吃掉的概率。
然后转移一下。答案就是只选i的状态。
代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using namespace std;
namespace Flandre_Scarlet
{
int n;
real a[N][N];
void Input()
{
scanf("%d",&n);
F(i,0,n-1) F(j,0,n-1) scanf("%lf",&a[i][j]);
}
real dp[1<<N];
void Soviet()
{
int All=(1<<n)-1;
dp[All]=1.00;
D(i,All-1,0)
{
real cnt=(real)__builtin_popcount(i);
F(j,0,n-1) if (!((1<<j)&i))
{
F(k,0,n-1) if ((1<<k)&i)
{
real P=1/(cnt*(cnt+1)/2.00);
dp[i]+=dp[i|(1<<j)]*a[k][j]*P;
}
}
}
F(i,0,n-1)
{
printf("%.6f ",dp[(1<<i)]);
}putchar('\n');
}
Flan IsMyWife()
{
Input();
Soviet();
}
}
int main()
{
Flandre_Scarlet::IsMyWife();
getchar();getchar();
return 0;
}
最后问一下,那个标题为什么显示不出来啊,有没有人救救我。。。