【POJ 3071】 Football(DP)

时间:2023-02-01 11:03:16

【POJ 3071】 Football(DP)

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4350   Accepted: 2222

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 ij, 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

Sample Output

2

Hint

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.

算是个概率dp,。。比較简单的

题目大意:要举办n场足球比赛。一共同拥有2^n支队伍。

比赛规则就是晋级型,第一个跟第二个比,第三个跟第四个。每场中赢的一支队伍进入下一场比赛。

最后仅仅有一个冠军。

大体就是树型的那种。

问有最大概率获得冠军的队伍编号,题目还保证不会有精度问题了。

这样n <= 7 最多1<<7 = 128个队伍。

dp[i][j] 表示编号为i的队伍在第j场比赛中胜出的概率

因为是树型,事实上当前场次每组胜出的队伍就是这个子树的根,他会与同父亲的还有一棵子树,或者说和他兄弟中的队伍比赛。

这样每次暴力枚举赢家,然后求出在该场胜出的概率就可以

代码例如以下:

#include <iostream>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <list>
#include <algorithm>
#include <map>
#include <set>
#define LL long long
#define Pr pair<int,int>
#define fread() freopen("in.in","r",stdin)
#define fwrite() freopen("out.out","w",stdout) using namespace std;
const int INF = 0x3f3f3f3f;
const int msz = 10000;
const int mod = 1e9+7;
const double eps = 1e-8; double win[133][133];
double dp[133][8]; int main()
{
//fread();
//fwrite(); int n,m;
while(~scanf("%d",&n) && ~n)
{
m = n;
memset(dp,0,sizeof(dp)); n = 1<<n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%lf",&win[i][j]); int ad,st,en;
for(int i = 0; i < m; ++i)
{
//当前场次覆盖的区间范围大小
ad = 1<<i; //printf("level:%d can:%d mx:%d ad:%d\n",i,tmp,k,ad); //st-ad表示当前球队所在范围
int st = 1, en = ad;
for(int j = 1; j <= n; ++j)
{
if(!i)
{
//printf("%dto%d\n",j,j+(j&1? 1: -1));
dp[j][i] = win[j][j+(j&1? 1: -1)];
}
else
{
if(j > en)
{
st += ad;
en += ad;
} //printf("%d-%d\n",st,en); //左子树
if(en&ad)
{
//printf("findin:%d-%d\n",st+ad,en+ad);
for(int z = st+ad; z <= en+ad; ++z)
dp[j][i] += win[j][z]*dp[z][i-1];
}
//右子树
else
{
//printf("findin:%d-%d\n",st-ad,en-ad);
for(int z = st-ad; z <= en-ad; ++z)
dp[j][i] += win[j][z]*dp[z][i-1];
}
dp[j][i] *= dp[j][i-1];
}
}
} int id = 1;
for(int i = 2; i <= n; ++i)
{
//printf("%d %f\n",i,dp[i][m-1]);
if(dp[id][m-1] < dp[i][m-1]) id = i;
}
printf("%d\n",id);
} return 0;
}

【POJ 3071】 Football(DP)的更多相关文章

  1. 【noi 2&period;6&lowbar;9270】&amp&semi;【poj 2440】DNA(DP)

    题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...

  2. 【POJ 3071】 Football

    [题目链接] http://poj.org/problem?id=3071 [算法] 概率DP f[i][j]表示第j支队伍进入第i轮的概率,转移比较显然 [代码] #include <algo ...

  3. 【noi 2&period;6&lowbar;9275】&amp&semi;【bzoj 3398】Bullcow(DP){Usaco2009 Feb}

    题意:一共有N只牡牛(公牛)和牝牛(母牛),每2只牡牛间至少要有K只牝牛才不会斗殴.问无斗殴发生的方案数. 解法:f[i][j]表示一共i只牛,最后一只是j(0为牝牛,1为牡牛)的方案数.f[i][0 ...

  4. 【HDU - 4345 】Permutation(DP)

    BUPT2017 wintertraining(15) #8F 题意 1到n的排列,经过几次置换(也是一个排列)回到原来的排列,就是循环了. 现在给n(<=1000),求循环周期的所有可能数. ...

  5. 【POJ - 3040】Allowance(贪心)

    Allowance 原文是English,这里就放Chinese了 Descriptions: 作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1 ...

  6. 【POJ - 3414】Pots(bfs)

    Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...

  7. 【POJ - 3104 】Drying(二分)

    Drying 直接上中文 Descriptions 每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台 ...

  8. 【POJ - 1862】Stripies (贪心)

    Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...

  9. 【POJ - 2431】Expedition(优先队列)

    Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...

随机推荐

  1. 昨日尝试使用百度死链提交,使用lCGI规则提交

    本来打算去掉北盟网校的死链,但就算配了规则,提交百度,但是好像还是没有删除到 认真阅读了百度的死链工具 好像需要将死链返回404错误提示 检查北盟的代码,发现北盟做了404从定向 在程序里面404从定 ...

  2. Erlang练习-UDP

    贴一下代码,例子是从别人那里直接抄来的: -module(myudp). -export([start/0, client/1]). %% Server start() -> spawn(fun ...

  3. UVA 10510 Cactus

    题意:给出一个有向图,问是不是仙人掌图.仙人掌图:每个边只在一个普通环内的强连通图. 解法:tarjan判断强连通分量是否为1个,记录找环的路径,在每找到一个环时遍历路径记录点出现的次数,如果出现有点 ...

  4. C语言-06复杂数据类型-04 结构体

    结构体的说明(构造类型) 数组:只能由多个相同类型的数据构成 结构体:可以由多个不同类型的数据构成 ,结构体的类型是不存在的,自己定义 int main() { // 1.定义结构体类型 定义类型的时 ...

  5. COMET技术具体实现 结合PHP和JQUERY

    具体看代码,费话不说 PHP服务端 $mem = new RTMEM(); if(!$mem->conn()) exit('no mem server'); if(!$mem->getst ...

  6. 重操JS旧业第十弹:闭包

    闭包是js最难理解,也是最蛋疼的一个名词,仿佛只可意会不可言传一样,有人说闭包说白了就是函数嵌套,也有人说闭包就是函数能够访问函数外部的变量,而内部的外部访问不了: 貌似都非常有道理,其实仔细想来只不 ...

  7. ios中的关键词retain release

    内存分析  在函数中只要用new  alloc  copy  这样的分配空间时 则计算器retain就要为一 每调用一次就要加一 在.m文件中引用手动计数时 一定要调用[super dealloc]这 ...

  8. js &vert;竖线字符串全部替换 replace

    一般人解决方案: 'a|b|c'.replace(/\|/g, ','); 神经病解决方案: 'a|b|c'.split('|').join(',');

  9. 队列-&gt&semi;队列的表示和实现

    文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除.和生活中的排队相似,最早进入队列的元素最早离 ...

  10. &lbrack;Shell&rsqb;sed命令在MAC和Linux下的不同使用方式

    ---------------------------------------------------------------------------------------------------- ...