P2719 搞笑世界杯
我觉得这个难度是假的,如果不知道这个是dp我就做不出来,好吧,知道我也没做出来。。
f[i][j]表示剩i张A票,j张B票时,最后两张票相同的概率。
当前的队首有一半的概率选A,一半的概率选B,
so f[i][j]=0.5*f[i-1][j]+0.5*f[i][j-1]
答案为f[n][n]

P2719 搞笑世界杯_i++P2719 搞笑世界杯_#include_02
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<cstring>
 8 #define inf 2147483647
 9 #define For(i,a,b) for(register int i=a;i<=b;i++)
10 #define p(a) putchar(a)
11 #define g() getchar()
12 //by war
13 //2017.10.17
14 using namespace std;
15 int n;
16 double f[2000][2000];//33M
17 void in(int &x)
18 {
19     int y=1;
20     char c=g();x=0;
21     while(c<'0'||c>'9')
22     {
23     if(c=='-')
24     y=-1;
25     c=g();
26     }
27     while(c<='9'&&c>='0')x=x*10+c-'0',c=g();
28     x*=y;
29 }
30 void o(int x)
31 {
32     if(x<0)
33     {
34         p('-');
35         x=-x;
36     }
37     if(x>9)o(x/10);
38     p(x%10+'0');
39 }
40 int main()
41 {
42     in(n);
43     n>>=1;
44     For(i,2,n)
45     f[i][0]=1.0;
46     For(i,2,n)
47     f[0][i]=1.0;
48     For(i,1,n)
49       For(j,1,n)
50         f[i][j]=(f[i-1][j]+f[i][j-1])*0.5;
51     printf("%.4f",f[n][n]);    
52      return 0;
53 }
View Code