codevs 1060 搞笑运动会 概率dp
题意: 计算一下排在队尾的两个人同时拿到一种票的概率是多少
思路:概率dp,dp[i][j]表示前i个人拿到j张A种票的概率 A和B都是一样的 所以答案乘2就好了
转移: dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]*0.5;
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 double dp[3000][3000]; 7 8 int main(){ 9 int n; cin>>n; 10 11 dp[0][0] = 1; 12 for(int i=1; i<=n; i++){ 13 dp[i][0] = dp[i-1][0]*0.5; 14 for(int j=1; j<=n/2; j++){ 15 if(j == n/2) 16 dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]; //dp[i-1][j]:前i-1个人已经拿完A种票了,第i个人只能拿B。 17 else 18 dp[i][j] = dp[i-1][j-1]*0.5+dp[i-1][j]*0.5; 19 } 20 } 21 22 printf("%.4f\n",dp[n-2][n/2]*2); 23 }