您的位置:首页 > 其它

POJ 2261

2012-10-18 13:24 183 查看
题意: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

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char name[20][50];
double dp[20][20],vs[20][20];
int main()
{
memset(dp,0,sizeof(dp));
for(int i=0;i<16;i++)
gets(name[i]),dp[i][0]=1.0;
for(int i=0;i<16;i++)
for(int j=0;j<16;j++)
scanf("%lf",&vs[i][j]),vs[i][j]/=100.0;
for(int k=1;k<=4;k++)
{
int len=1<<k,mid=len>>1;
for(int i=0;i<16;i+=len)
{
for(int j=0;j<mid;j++)
{
for(int t=mid;t<len;t++)
{
dp[i+j][k]+=dp[i+j][k-1]*dp[i+t][k-1]*vs[i+j][i+t];
dp[i+t][k]+=dp[i+j][k-1]*dp[i+t][k-1]*vs[i+t][i+j];
}
}
}
}
for(int i=0,j;i<16;i++)
{
j=0;
while(name[i][j]!='\0')
putchar(name[i][j++]);
while(j<10)
putchar(' '),j++;
printf("p=%.2lf%%\n",dp[i][4]*100.0);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: