POJ3071 Football 【概率dp】

题目

Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all teams still in the tournament are placed in a list in order of increasing index. Then, the first team in the list plays the second team, the third team plays the fourth team, etc. The winners of these matches advance to the next round, and the losers are eliminated. After n rounds, only one team remains undefeated; this team is declared the winner.

Given a matrix P = [pij] such that pij is the probability that team i will beat team j in a match determine which team is most likely to win the tournament.

输入格式

The input test file will contain multiple test cases. Each test case will begin with a single line containing n (1 ≤ n ≤ 7). The next 2n lines each contain 2n values; here, the jth value on the ith line represents pij. The matrix P will satisfy the constraints that pij = 1.0 ? pji for all i ≠ j, and pii = 0.0 for all i. The end-of-file is denoted by a single line containing the number ?1. Note that each of the matrix entries in this problem is given as a floating-point value. To avoid precision problems, make sure that you use either the double data type instead of float.

输出格式

The output file should contain a single line for each test case indicating the number of the team most likely to win. To prevent floating-point precision issues, it is guaranteed that the difference in win probability for the top two teams will be at least 0.01.

输入样例

Language:

Football

Time Limit: 1000MS Memory Limit: 65536K

Total Submissions: 6356 Accepted: 3245

Description

Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all teams still in the tournament are placed in a list in order of increasing index. Then, the first team in the list plays the second team, the third team plays the fourth team, etc. The winners of these matches advance to the next round, and the losers are eliminated. After n rounds, only one team remains undefeated; this team is declared the winner.

Given a matrix P = [pij] such that pij is the probability that team i will beat team j in a match determine which team is most likely to win the tournament.

Input

The input test file will contain multiple test cases. Each test case will begin with a single line containing n (1 ≤ n ≤ 7). The next 2n lines each contain 2n values; here, the jth value on the ith line represents pij. The matrix P will satisfy the constraints that pij = 1.0 ? pji for all i ≠ j, and pii = 0.0 for all i. The end-of-file is denoted by a single line containing the number ?1. Note that each of the matrix entries in this problem is given as a floating-point value. To avoid precision problems, make sure that you use either the double data type instead of float.

Output

The output file should contain a single line for each test case indicating the number of the team most likely to win. To prevent floating-point precision issues, it is guaranteed that the difference in win probability for the top two teams will be at least 0.01.

Sample Input

2

0.0 0.1 0.2 0.3

0.9 0.0 0.4 0.5

0.8 0.6 0.0 0.6

0.7 0.5 0.4 0.0

-1

输出样例

2

提示

In the test case above, teams 1 and 2 and teams 3 and 4 play against each other in the first round; the winners of each match then play to determine the winner of the tournament. The probability that team 2 wins the tournament in this case is:

P(2 wins) = P(2 beats 1)P(3 beats 4)P(2 beats 3) + P(2 beats 1)P(4 beats 3)P(2 beats 4)

= p21p34p23 + p21p43p24

= 0.9 · 0.6 · 0.4 + 0.9 · 0.4 · 0.5 = 0.396.

The next most likely team to win is team 3, with a 0.372 probability of winning the tournament.

题解

简单来说就是一个淘汰制赛制,给出每对选手之间的胜率,求胜率最大的选手

我们令\(f[i][j]\)表示i号选手,第j轮获胜的概率

第j轮要获胜,首先第j - 1轮要获胜,还要击败第j轮的对手

那么就有\(f[i][j] = f[i]][j - 1] * \sum_{k \in opposite} win[i][k] * f[k][j - 1]\)

每次只需枚举区间内的对手累加概率就好了

\(O(n^3)\)

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<‘ ‘; puts("");
using namespace std;
const int maxn = 1 << 8,maxm = 100005,INF = 1000000000;
double f[maxn][10];
double win[maxn][maxn];
int n,m;
int main(){
    while (~scanf("%d",&m) && m >= 0){
        n = 1 << m;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                scanf("%lf",&win[i][j]);
        for (int i = 0; i < n; i++) f[i][0] = 1.0;
        for (int j = 1; j <= m; j++){
            for (int i = 0; i < n; i++){
                f[i][j] = 0;
                int b = i / (1 << j - 1),op = b ^ 1;
                //printf("round %d  id: %d block: %d\n",j,i,b);
                for (int k = op * (1 << j - 1); k / (1 << j - 1) == op; k++)
                    f[i][j] += win[i][k] * f[k][j - 1];
                f[i][j] *= f[i][j - 1];
            }
        }
        int ans = 0;
        for (int i = 1; i < n; i++) if (f[i][m] > f[ans][m]) ans = i;
        //REP(i,n) printf("%.2lf ",f[i - 1][m]); puts("");
        printf("%d\n",ans + 1);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Mychael/p/8408677.html

时间: 2024-08-06 23:56:27

POJ3071 Football 【概率dp】的相关文章

[poj3071]football概率dp

题意:n支队伍两两进行比赛,求最有可能获得冠军的队伍. 解题关键:概率dp,转移方程:$dp[i][j] +  = dp[i][j]*dp[i][k]*p[j][k]$表示第$i$回合$j$获胜的概率,原理为全概率公式. 如何判断相邻,通过位运算. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cmath> 6

POJ3071(Football)--概率DP

题目在这 题意:有(1<<n个足球队进行比赛,在经过多轮一对一淘汰赛后决出冠军队伍,问最后哪支队伍能够获胜,即输出获胜概率最大的那支队伍编号.给了你n*n的矩阵,用来表示每支队伍间的各自胜率.输入-1为表示结束 en....网上当然也后不少解题报告,但是很多直接给出状态转移方程和贴出代码,而少了其中重要的推断过程,我觉得不是很好.所以自己给写一个较为详细的过程 首先呢,以n==3为例子,即8支队伍参赛.一种比赛情形是这样的 由图可知,在题中给定n后,需要比赛n轮即可知道冠军队伍是谁,我这里多了

poj3071之概率DP

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2667   Accepted: 1361 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

[ACM] POJ 3071 Football (概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2875   Accepted: 1462 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the

POJ 3071:Football 概率DP

Football 题目链接: http://poj.org/problem?id=3071 题意: 有2^n支足球队在比赛,实行淘汰制,规则如下:第一轮  1与2比,3与4比...  第二轮  1.2中的胜者和3.4中的胜者比... 以此类推 直到第n轮决出winner,求最终胜利的球队编号. 题解: 设dp[i][j]为在第i轮中j号球队胜利的概率  转移方程:dp[i][j]=∑(dp[i-1][w]*dp[i-1][j]*p[j][w])   w为该轮可能与j球队比赛的球队,则该轮j胜w的

poj 3071 Football (概率DP水题)

G - Football Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all teams

POJ 3071 Football (概率DP)

题意:给定 2的n次方 个团队对每个队的战胜的概率,一块要打 n 场,每场都是 1 对 2, 2 对 3,每次都取赢的一方,问你最后谁是冠军的概率最大. 析:dp[i][j] 表示 第 i 场 j 胜的概率,每次只要算 i 相邻的且不是已经打过的 2 i-1次方个队,最后再选出概率最大的就好. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include &l

poj3071(概率DP)

题意:淘汰赛制,2^n(n<=7)个队员.给出相互PK的输赢概率矩阵.问谁最有可能赢到最后. 解法:ans[i][j]表示第i个队员第j轮胜出的概率.赢到最后需要进行n场比赛.算出每个人赢到最后的ans[i][n].写出序号的二进制发现一个规律,两个队员i.j如果碰到,那么一定是在第get(i,j)场比赛碰到的.get(i,j)计算的是i和j二进制不同的最高位,这个规律也比较明显. 代码: /****************************************************

POJ 3071 Football(简单 概率DP)

Football 原文链接:http://blog.csdn.net/xuechelingxiao/article/details/38520105 大意:2^n 个球队进行单场淘汰赛,每两只球队之间比赛会有胜负的概率,问最后谁夺冠的概率最大. 思路:简单的概率DP问题,主要是怎么处理哪两个球队比赛的问题. DP方程为 dp[i][j] = ∑(dp[i-1][j]*dp[i-1][k]*p[j][k]); //dp[i][j]表示第 i 轮的时候,第 j 支队伍赢的概率.. 对于其中位运算,可

POJ 3071 Football (动态规划-概率DP)

Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2768   Accepted: 1412 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, -, 2n. In each round of the tournament, all teams still in the