现在的位置: 首页 > 综合 > 正文

poj 3071 概率dp

2013年02月26日 ⁄ 综合 ⁄ 共 920字 ⁄ 字号 评论关闭

题意是:有2^n支队伍,告诉你p【j】【k】表示j打败k的概率。求最后赢得比赛概率最大的队伍。

dp【i】【j】 表示在第i回合,j获胜的概率

此题需要注意的是比赛队伍的次序,第一回合:1和2 比赛,3和4 ,5 和6 ,7和8, 依次类推;

if(((j>>(i-1))^1)==(k>>(i-1))) 判断j和k是否可以比赛;

比如3支队伍,可以比赛的队伍是:

0 1    1 0    2 3     3 2  4 5  5 4  6 7  7 6   0 2  0 3   1 2  1 3  2 0  2 1  3 0  3 1  4 6  4 7  5 6   5 7  6 4  6 5  7 4   7 5  0 4   0 5   0 6   0 7  1 4   1 5  1 6   1 7  2 4  2 5
2 6  2 7  3 4  3 5  3 6  3 7  4 0  4 1  4 2  4 3  5 0  5 1  5 2  5 3  6 0  6 1  6 2  6 3  7 0  7 1    7 2   7 3

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
using namespace std;
#define FF  freopen("Input.txt","r",stdin)
#define mem(x,y) memset(x,y,sizeof(x))
double dp[10][300];
double p[300][300];
int main()
{
    int n=3,i,j,k;
    while(scanf("%d",&n)&&n!=-1)
    {
        mem(dp,0);
        for(i=0;i<(1<<n);i++)
        {
            dp[0][i]=1;
            for(j=0;j<(1<<n);j++)
              scanf("%lf",&p[i][j]);
        }
        for(i=1;i<=n;i++)
          for(j=0;j<(1<<n);j++)
            for(k=0;k<(1<<n);k++)
              if(((j>>(i-1))^1)==(k>>(i-1)))
                dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];
        double res=0;int x=-1;
        for(i=0;i<(1<<n);i++)
          if(res<dp[n][i])
          {
              res=dp[n][i];
              x=i;
          }
        printf("%d\n",x+1);
    }
    return 0;
}

抱歉!评论已关闭.