【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.6_9270】&【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.6_9275】&【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. 使用Oracle DBLink进行数据库之间对象的訪问操作

    Oracle中自带了DBLink功能,它的作用是将多个oracle数据库逻辑上看成一个数据库,也就是说在一个数据库中能够操作还有一个数据库中的对象,比如我们新建了一个数据database1.我们须要操 ...

  2. JavaScript 扩展运算符

    扩展运算符格式扩展运算符格式很简单,就是三个点(...) 扩展运算符作用???扩展运算符允许一个表达式在期望多个参数(用于函数调用)或多个元素(用于数组字面量)或多个变量(用于解构赋值)的位置扩展. ...

  3. HDU 4081 Qin Shi Huang&#39;s National Road System(最小生成树/次小生成树)

    题目链接:传送门 题意: 有n坐城市,知道每坐城市的坐标和人口.如今要在全部城市之间修路,保证每一个城市都能相连,而且保证A/B 最大.全部路径的花费和最小,A是某条路i两端城市人口的和,B表示除路i ...

  4. lufylegend:加载进度

    实现图片加载进度 LoadingSample Class 用来显示进度条的对象. 引擎中目前提供的进度条类有:LoadingSample1-7 你可以制作自己的进度条,自制进度条类中要包含setPro ...

  5. Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)

    这是“windows phone mango本地数据库(sqlce)”系列短片文章的第十一篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将覆盖所有你需要知道的 ...

  6. 集群服务器下使用SpringBoot @Scheduled注解定时任务

    原文:https://blog.csdn.net/huyang1990/article/details/78551578 SpringBoot提供了 Schedule模块完美支持定时任务的执行 在实际 ...

  7. AndroidStudio工具将Module项目导出成Jar和arr库

    原文:http://blog.csdn.net/liulei823581722/article/details/52919697 该篇首先讲述利用AndroidStudio如何把一个module项目导 ...

  8. 黑镜第一至二季/全集Black Mirror迅雷下载

    本季第一.二季 Black Mirror (2011-2013)看点:<黑镜>(Black Mirror)是一部由查理·布洛克主创.英国电视4台(Channel 4)于2011年12月播出 ...

  9. Mac下启动AndroidStudio失败

    系统环境: OSX Yosemite 10.10.1 (14B25) JAVA版本:1.8.0_11 Android Studio 版本:1.0.1 问题:Android Studio was una ...

  10. layUI 几个简单的弹出层

    导入控件主题 <link rel="stylesheet" href="dist/themes/default/style.min.css" /> ...