POJ 3071

求概率。其实跟枚举差不多,输入n即是要进行n轮比赛。对每一支球队,设求1的概率,首先1要与2比赛为p1,这是第一轮,第二轮时,1要与3(打败3为p2),4(打败4为p3)中胜者比赛,由于是概率,则两者都要比,求出概率。所以,1要在第二轮胜的概率=p1*(p2*3第一轮胜出的概率+p3*4在第一轮胜出概率)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

double def[130][130];
double p[8][130];

int main(){
	int n,ttp,bgn,ed,pos;
	while(scanf("%d",&n)!=EOF){
		if(n==-1) break;
		for(int i=1;i<=(1<<n);i++)
		for(int j=1;j<=(1<<n);j++)
		scanf("%lf",&def[i][j]);
		int tot=(1<<n);
		for(int i=1;i<=tot;i++)
		p[0][i]=1;
		for(int i=1;i<=n;i++){
			pos=1;
			while(pos<=tot){
				ttp=pos;
				bgn=ttp+(1<<(i-1));
				ed=bgn+(1<<(i-1))-1;
				for(int k=ttp;k<ttp+(1<<(i-1));k++){
					double sum=0;
					for(int j=bgn;j<=ed;j++)
					sum+=(p[i-1][j]*def[k][j]);
					p[i][k]=sum*p[i-1][k];
				}
				ttp=pos+(1<<(i-1));
				bgn=pos; ed=bgn+(1<<(i-1))-1;
				for(int k=ttp;k<ttp+(1<<(i-1));k++){
					double sum=0;
					for(int j=bgn;j<=ed;j++)
					sum+=(p[i-1][j]*def[k][j]);
					p[i][k]=sum*p[i-1][k];
				}
				pos+=(1<<i);
			}
		}
		int ans=1;
		for(int i=1;i<=tot;i++)
		if(p[n][i]>p[n][ans])
		ans=i;
		printf("%d\n",ans);
	}
	return 0;
}

  

时间: 2024-10-04 04:20:19

POJ 3071的相关文章

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

[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)

[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 tea

poj 3071 概率DP 位运算

Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice POJ 3071 Description Consider a single-elimination football tournament involving 2n teams, denoted 1, 2, …, 2n. In each round of the tournament, all tea

poj 3071 Football (概率 dp)

链接:poj 3071 题意:有2^n个队,相邻的两两打淘汰赛,n轮后必定会决出冠军, 求最后哪个队夺冠的概率最大 分析:dp[i][j]表示第i轮的时候,第j去支队伍赢的概率 则dp[i][j]的前提就是i-1轮的时候,j是赢的,且第i轮赢了对方 接下来就是找到第i轮的时候,他的可能队手(难点) 所有对手的编号为1-2^n,通过二进制可以发现规律, 若第j队和对手k队在第i轮比赛,那么(j-1)和(k-1)二进制第i位刚好相反, 从i+1位开始所有高位是一样的,可以利用位运算判断是否为对手 状

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

通道:http://poj.org/problem?id=3071 题意:有2^n个队伍,给出两两pk的胜率,求胜率最大的是哪个队.pk有限制,那就是相邻2个pk 思路:pk的方式其实就是在走一棵树,所以判断2者是否能够PK,那么判断最高几位就可以了,设dp[i][j]第i轮,j胜利的概率,则dp[i][j] = ∑dp[i-1][j]*dp[i-1][k]*p[j][k] 代码;https://github.com/Mithril0rd/Rojo/blob/master/poj3071.cpp

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轮比

【POJ 3071】 Football

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