【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 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
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)的更多相关文章
- 【noi 2.6_9270】&【poj 2440】DNA(DP)
题意:问长度为L的所有01串中,有多少个不包含"101"和"111"的串. 解法:f[i][j]表示长度为i的01串中,结尾2位的十进制数是j的合法串的个数.那 ...
- 【POJ 3071】 Football
[题目链接] http://poj.org/problem?id=3071 [算法] 概率DP f[i][j]表示第j支队伍进入第i轮的概率,转移比较显然 [代码] #include <algo ...
- 【noi 2.6_9275】&【bzoj 3398】Bullcow(DP){Usaco2009 Feb}
题意:一共有N只牡牛(公牛)和牝牛(母牛),每2只牡牛间至少要有K只牝牛才不会斗殴.问无斗殴发生的方案数. 解法:f[i][j]表示一共i只牛,最后一只是j(0为牝牛,1为牡牛)的方案数.f[i][0 ...
- 【HDU - 4345 】Permutation(DP)
BUPT2017 wintertraining(15) #8F 题意 1到n的排列,经过几次置换(也是一个排列)回到原来的排列,就是循环了. 现在给n(<=1000),求循环周期的所有可能数. ...
- 【POJ - 3040】Allowance(贪心)
Allowance 原文是English,这里就放Chinese了 Descriptions: 作为创纪录的牛奶生产的奖励,农场主约翰决定开始给Bessie奶牛一个小的每周津贴.FJ有一套硬币N种(1 ...
- 【POJ - 3414】Pots(bfs)
Pots 直接上中文 Descriptions: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DRO ...
- 【POJ - 3104 】Drying(二分)
Drying 直接上中文 Descriptions 每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台 ...
- 【POJ - 1862】Stripies (贪心)
Stripies 直接上中文了 Descriptions 我们的化学生物学家发明了一种新的叫stripies非常神奇的生命.该stripies是透明的无定形变形虫似的生物,生活在果冻状的营养培养基平板 ...
- 【POJ - 2431】Expedition(优先队列)
Expedition 直接中文 Descriptions 一群奶牛抓起一辆卡车,冒险进入丛林深处的探险队.作为相当差的司机,不幸的是,奶牛设法跑过一块岩石并刺破卡车的油箱.卡车现在每运行一个单位的距离 ...
随机推荐
- Revit Family API 添加对齐
没测试成功,留待以后研究. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] ; ; i < nV ...
- Revit API取得全部元素
; ; ; ; } ; } ; } TaskDialog ...
- Xamarin.iOS,AOT,JIT,Limitations
Since applications on the iPhone using Xamarin.iOS are compiled to static code, it is not possible t ...
- 多个按钮触发同一个Bootstrap自适应模态窗口
在项目中可能会面对这样的一个场景: 界面上有多个按钮,我们希望点击这些按钮弹出同一个模态窗口,但希望模态窗口的内容是动态生成的,即,点击每个按钮弹出的模态窗口内容不同. 通常情况下,一个按钮对应一个模 ...
- 再谈vc发送键盘、组合键消息
关于向Windows窗口发送Alt组合键的问题,这个真是经典问题啊,在网上找了一下,问的人N多,方法差不多, 但就是没有很好解决问题. 之前找到一个能正确发送的code:(Alt+A) PostMes ...
- 连接ORACLE数据库,是不是必须要安装oracle客户端的运行时
大神给的回答: net连接oracle使用的是oci接口,必须安装oracle客户端,并配置本地网络服务名 tnsnames.ora.不过oracle网站有精简版的客户端软件,不到30M吧,解压,并编 ...
- Android 开机画面和wallpaper总结
Android 开机画面和wallpaper总结 1 kernel的开机画面修改 1.图片需求:图片格式:png图片大小:1024x600(具体示lcd分辨率而定). 2.转换图片png图片. 假设 ...
- 设计模式之代理模式之二(Proxy)
from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html 设计模式之代理模式之二(Proxy) 0.前言 在前 ...
- 平台升级至nginx+Tomcat9.0.1(Spring5.0.1+velocity2.0+quartz-2.3.0)+redis集群
在公司部份应用上 使用了 Tomcat9.0.1 稳定性还可以,由于将公司的集群服务也升级为 Tomcat9.0.1,下面我们来谈一下改变: 1:logging.properties 支持日志最大天数 ...
- 从源码角度一步一步来修改PreferenceActivity界面
PreferenceActivity给我们封装好了一个数据存储对象,我们只需要在xml文件中写上控件即可完成简单的设置界面.但是系统提供的设置界面十分的简陋,要想做的好看必须要自己来进行修改 ...