其实懂了之后很简单, 但是刚开始真的很难想.. d[a][b] 表示剩 a 张 A 类票和 b 张 B 类票时, 最后两张票相同的概率
那么此时的排队的第一个人只有两种选择 拿 A 类票或者 B 类票
抛硬币得到的可能性当然是二分之一, 所以说 d[i-1][j](当前第一人拿了 A 类票) 和 d[i][j-1](当前第一人拿了 B 类票) 各占二分之一
这样的话代码就很简单了....
- #include<stdio.h>
- #include<iostream>
- using namespace std;
- double d[1500][1500];
- int main()
- {
- int n,i,j;
- scanf("%d",&n);
- n/=2;
- for (i=2;i<=n;i++)
- {
- d[i][0]=d[0][i]=1;
- }
- for (i=1;i<=n;i++)
- {
- for (j=1;j<=n;j++)
- {
- d[i][j]=(d[i-1][j]+d[i][j-1])*0.5;
- }
- }
- printf ("%.4lf",d[n][n]);
- return 0;
- }
- View Code
来源: http://www.bubuko.com/infodetail-3217245.html