题意: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 }