zstu 2386 && 1910 poj 3071 概率DP

这两题基本是一样的,模拟球队之间对战、晋级,整个过程就是一颗满二叉树,最终根节点的位置就是冠军

这道题目有一个很神奇的地方,改天我会仔细解释,现在先留着代码

View Code
 1 #include<stdio.h>
2 #include<string.h>
3 double p[130][130];
4 double dp[130][8];
5 int main(){
6 int i,j,t,cases=1;
7 char str[20][20];
8 scanf("%d",&t);
9 while(t--){
10 for(i=0;i<16;i++)
11 scanf("%s",str[i]);
12 for(i=0;i<16;i++){
13 for(j=0;j<16;j++){
14 scanf("%lf",&p[i][j]);
15 p[i][j]/=100.0;
16 }
17 dp[i][0]=1;
18 }
19 for(i=0;i<4;i++)
20 for(j=0;j<16;j++){
21 double sum=0;
22 for(int k=(1<<i);k<(1<<(i+1));k++)
23 sum+=dp[k^j][i]*p[j][k^j];
24 dp[j][i+1]=dp[j][i]*sum;
25 }
26 printf("Scenario #%d:\n",cases++);
27 for(i=0;i<16;i++){
28 printf("%-10s",str[i]);
29 printf("%7.2lf\n",dp[i][4]*100);
30 }if(t) puts("");
31 }
32 return 0;
33 }
34 /*
35 Germany 17.69
36 Sweden 3.45
37 Argentina 12.32
38 Mexico 2.65
39 Italy 7.04
40 Australia 1.81
41 Switzerl 2.43
42 Ukraine 3.46
43 England 7.75
44 Ecuador 1.83
45 Portugal 5.19
46 Holland 6.36
47 Brazil 12.20
48 Ghana 0.89
49 Spain 11.47
50 France 3.46
51 */

代码几乎一样

View Code
#include<stdio.h>
#include<string.h>
double p[130][130];
double dp[130][8];
int main()
{
int n,i,j;
while(scanf("%d",&n),n!=-1)
{
int m=(1<<n);
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
scanf("%lf",&p[i][j]);
}
dp[i][0]=1;
}
int win;
for(i=0;i<n;i++)
{
win=0;
for(j=0;j<m;j++)
{
double sum=0;
for(int k=(1<<i);k<(1<<(i+1));k++)
{
sum+=dp[k^j][i]*p[j][k^j];
}
dp[j][i+1]=dp[j][i]*sum;
if(dp[j][i+1]>dp[win][i+1]) win=j;
}
}
printf("%d\n",win+1);
}
return 0;
}



你可能感兴趣的:(poj)