题意:16个国家的竞赛图,给出每个国家打败其他国家的概率,求每个国家最后夺冠的概率。

题解:dp[i][k]代表第i个国家成功进入第k轮的概率,那么dp[i][k]=sum(dp[i][k-1]*dp[j][k-1]*vs[i][j]),其中,j为这一轮i可能面对的国家。PS:国家名字占10个字符,还需要空一格再输出概率~

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 char name[20][50];
 6 double dp[20][20],vs[20][20];
 7 int main()
 8 {
 9     memset(dp,0,sizeof(dp));
10     for(int i=0;i<16;i++)
11         gets(name[i]),dp[i][0]=1.0;
12     for(int i=0;i<16;i++)
13         for(int j=0;j<16;j++)
14             scanf("%lf",&vs[i][j]),vs[i][j]/=100.0;
15     for(int k=1;k<=4;k++)
16     {
17         int len=1<<k,mid=len>>1;
18         for(int i=0;i<16;i+=len)
19         {
20             for(int j=0;j<mid;j++)
21             {
22                 for(int t=mid;t<len;t++)
23                 {
24                     dp[i+j][k]+=dp[i+j][k-1]*dp[i+t][k-1]*vs[i+j][i+t];
25                     dp[i+t][k]+=dp[i+j][k-1]*dp[i+t][k-1]*vs[i+t][i+j];
26                 }
27             }
28         }
29     }
30     for(int i=0,j;i<16;i++)
31     {
32         j=0;
33         while(name[i][j]!='\0')
34             putchar(name[i][j++]);
35         while(j<10)
36             putchar(' '),j++;
37         printf("p=%.2lf%%\n",dp[i][4]*100.0);
38     }
39     return 0;
40 }