POJ 3071 Football:概率dp
题目链接:http://poj.org/problem?id=3071
题意:
给定n,有2^n支队伍参加足球赛。
给你所有的p[i][j],表示队伍i打败队伍j的概率。
淘汰赛制。第一轮(1,2)两队比、(3,4)比、(5,6)比...共进行n轮比赛后产生冠军。
问你冠军最有可能是哪支队伍。
题解:
表示状态:
dp[i][j] = probability to win
第i支队伍能够参加第j轮比赛的概率。
找出答案:
i of max dp[i][n+1]
n轮比赛后,冠军该参加第n+1轮比赛(不存在的)。
如何转移:
now: dp[i][j]
dp[i][j+1] = ∑ (dp[i][j] * dp[k][j] * p[i][k]) (加法原理)
k: 第j轮比赛和i比的队伍
P(i晋级到j+1轮) = ∑ (P(i晋级到j轮) * P(k晋级到j轮) * P(i打败k))
怎样枚举k:
将所有队伍从0开始编号,并用二进制表示。
第i支战队第j轮会碰到的对手是:将i化为二进制,从右往左开始算,第j-1位会不同,第j位开始要相同,其余位任意的所有数。
边界条件:
dp[i][1] = 1
others = 0
注:本题居然卡cin。。。 (*`皿´*)ノ
AC Code:
// state expression:
// dp[i][j] = probability to win
// i: which team
// j: which round
//
// find the answer:
// i of max dp[i][n+1]
//
// transferring:
// dp[i][j+1] = sigma (dp[i][j] * dp[k][j] * p[i][k])
// 0<=t<(1<<(j-1))
// k = (((i>>(j-1))^1)<<(j-1))|t
//
// boundary:
// dp[i][1] = 1
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 10
#define MAX_T 150 using namespace std; int n;
int ans;
double p[MAX_T][MAX_T];
double dp[MAX_T][MAX_N]; void read()
{
for(int i=;i<(<<n);i++)
{
for(int j=;j<(<<n);j++)
{
scanf("%lf",&p[i][j]);
}
}
} void solve()
{
memset(dp,,sizeof(dp));
for(int i=;i<(<<n);i++)
{
dp[i][]=;
}
for(int j=;j<=n;j++)
{
for(int i=;i<(<<n);i++)
{
for(int t=;t<(<<(j-));t++)
{
int k=((((i>>(j-))^)<<(j-))|t);
dp[i][j+]+=dp[i][j]*dp[k][j]*p[i][k];
}
}
}
double maxn=;
for(int i=;i<(<<n);i++)
{
if(dp[i][n+]>maxn)
{
maxn=dp[i][n+];
ans=i+;
}
}
} void print()
{
printf("%d\n",ans);
} int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==-) break;
read();
solve();
print();
}
}
POJ 3071 Football:概率dp的更多相关文章
- poj 3071 Football (概率DP水题)
G - Football Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- POJ 3071 Football(概率DP)
题目链接 不1Y都对不住看过那么多年的球.dp[i][j]表示i队进入第j轮的概率,此题用0-1<<n表示非常方便. #include <cstdio> #include &l ...
- poj 3071 Football(概率dp)
id=3071">http://poj.org/problem? id=3071 大致题意:有2^n个足球队分成n组打比赛.给出一个矩阵a[][],a[i][j]表示i队赢得j队的概率 ...
- POJ 3071 Football (概率DP)
概率dp的典型题.用dp[j][i]表示第j个队第i场赢的概率.那么这场要赢就必须前一场赢了而且这一场战胜了可能的对手.这些都好想,关键是怎么找出当前要算的队伍的所有可能的竞争对手?这个用异或来算,从 ...
- POJ 3071 Football
很久以前就见过的...最基本的概率DP...除法配合位运算可以很容易的判断下一场要和谁比. from——Dinic算法 Football Time ...
- POJ3071:Football(概率DP)
Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2 ...
- POJ 3156 - Interconnect (概率DP+hash)
题意:给一个图,有些点之间已经连边,现在给每对点之间加边的概率是相同的,问使得整个图连通,加边条数的期望是多少. 此题可以用概率DP+并查集+hash来做. 用dp(i,j,k...)表示当前的每个联 ...
- poj 1322 Chocolate (概率dp)
///有c种不同颜色的巧克力.一个个的取.当发现有同样的颜色的就吃掉.去了n个后.到最后还剩m个的概率 ///dp[i][j]表示取了i个还剩j个的概率 ///当m+n为奇时,概率为0 # inclu ...
- [poj3071]football概率dp
题意:n支队伍两两进行比赛,求最有可能获得冠军的队伍. 解题关键:概率dp,转移方程:$dp[i][j] + = dp[i][j]*dp[i][k]*p[j][k]$表示第$i$回合$j$获胜的概率 ...
随机推荐
- 【Python】matplotlib绘制折线图
一.绘制简单的折线图 import matplotlib.pyplot as plt squares=[1,4,9,16,25] plt.plot(squares) plt.show() 我们首先导入 ...
- 浅谈对TDD的看法
程序猿对TDD这个词一定不陌生.近几年比較火.英文全称Test-Driven Development,測试驱动开发. 它要求在编写某个功能的代码之前先编写測试代码,然后仅仅编写使測试通过的功能代码,通 ...
- Oracle 连接、会话数的查看,修改
http://blog.csdn.net/xiaoyao6650/article/details/4027041 查看processes #当前的连接数 select count(*) from v$ ...
- Android 中保存全局变量
作者:silence鼬.2015年6月28日 在学习Android的时候一直未context的问题认为头疼,由于想做一些工具类,可是又不是四大组件.总要来回传递context.认为非常麻烦,就想全局获 ...
- C# 请求Web Api 接口,返回的json数据直接反序列化为实体类
须要的引用的dll类: Newtonsoft.Json.dll.System.Net.Http.dll.System.Net.Http.Formatting.dll Web Api接口为GET形式: ...
- neural network and deep learning笔记(1)
neural network and deep learning 这本书看了陆陆续续看了好几遍了,但每次都会有不一样的收获. DL领域的paper日新月异.每天都会有非常多新的idea出来,我想.深入 ...
- 加入 centos 右键 terminal
centos6.2以上默认右键都没有terminal,现加入方法 例如以下 1> yum -y install nautilus-open-terminal 2> shutdown -r ...
- ASP.NET数据库连接字符串的加密与解密
ASP.NET web.config中,数据库连接字符串的加密与解密. 虽然不怎么新鲜,但相信还是有许多人不知道,好,不说废话,直接给方法:开始--->运行,输入cmd,接着输入以下内容 加密: ...
- jquery 获取 outerHtml
在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包括当前节点本身的代码,然后我们有时候确须要.找遍jQuery api文档也没有不论什么方法能够拿到. 看到有的人通过pa ...
- zookeeper参数的详解
安装和配置详解 本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookee ...