码迷,mamicode.com
首页 > 其他好文 > 详细

[poj3071]football概率dp

时间:2017-08-29 21:38:36      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:i++   blog   eof   stream   std   lib   color   位运算   string   

题意:n支队伍两两进行比赛,求最有可能获得冠军的队伍。

解题关键:概率dp,转移方程:$dp[i][j] +  = dp[i][j]*dp[i][k]*p[j][k]$表示第$i$回合$j$获胜的概率,原理为全概率公式。

如何判断相邻,通过位运算。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<iostream>
 7 using namespace std;
 8 typedef long long ll;
 9 double arr[130][130];
10 double dp[130][130];
11 int main(){
12     int n;
13     while(scanf("%d",&n)&&(n!=-1)){
14         memset(dp,0,sizeof dp);
15         int len=1<<n;
16         for(int i=0;i<len;i++){
17             for(int j=0;j<len;j++){
18                 scanf("%lf",&arr[i][j]);
19             }
20         } 
21         for(int i=0;i<len;i++) dp[0][i]=1;
22         
23         for(int i=1;i<=n;i++){
24             for(int j=0;j<len;j++){
25                 for(int k=0;k<len;k++){
26                     if(((j>>(i-1))^1)==k>>(i-1)){
27                         dp[i][j]+=dp[i-1][k]*dp[i-1][j]*arr[j][k];
28                     }
29                 }
30             }
31         }
32 
33         double ans=0.0;
34         int ind=0;
35         for(int i=0;i<len;i++){
36             if(dp[n][i]>ans){
37                 ans=dp[n][i];
38                 ind=i;
39             }
40         }
41         printf("%d\n",ind+1);
42     }
43 
44     return 0;
45 }

 

[poj3071]football概率dp

标签:i++   blog   eof   stream   std   lib   color   位运算   string   

原文地址:http://www.cnblogs.com/elpsycongroo/p/7450060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!