Football (概率dp+二进制运用)

news/2024/6/16 10:49:11 标签: 算法, 动态规划

LINK

题目

在这里插入图片描述

题目大意

有 n 场比赛, 2 n 2^n 2n 支队伍,给出两两队伍之间比赛的胜率。问:哪个队伍成为冠军的概率最大。

思路

概率dp从前往后推
d p [ i ] [ j ] : dp[i][j]: dp[i][j]: j j j个队伍在第 i i i场获胜的概率
求其获胜概率可以推出式子:
d p [ i ] [ j ] + = d p [ i − 1 ] [ j ] ∗ d p [ i − 1 ] [ k ] ∗ a [ j ] [ k ] dp[i][j]+=dp[i-1][j]*dp[i-1][k]*a[j][k] dp[i][j]+=dp[i1][j]dp[i1][k]a[j][k]
含义为在第 i i i j j j获胜的概率为在 i i i的前一场 j j j获胜的概率 ∗ * i i i的前一场 k k k获胜的概率 ∗ j *j j k k k比赛时 j j j获胜的概率
二进制运用:
由于此时比赛过的队伍不能重复,所以运用二进制将其按顺序比赛

(j>>(i-1))==(k>>(i-1)^1)

第1场看其最低位不同且比最低位大的其它位相同的打比赛
第2次看其次低位不同且比最次位大的其它位相同的打比赛
……(可以自己模拟一下)

代码

#include<iostream>
using namespace std;
#define ll long long
//#define int long long
const int N = 1e5+10;
const double eps=1e-8;
double dp[150][150];//j在第i场获胜的概率 
double a[150][150];//i和j比赛i获胜的概率 
signed main(){
//	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
	while(scanf("%d",&n)){
		if(n==-1)break;
		int num=1<<n;
		for(int i=0;i<num;i++){
			for(int j=0;j<num;j++){
				scanf("%lf",&a[i][j]);
			}
		}
		for(int i=0;i<num;i++)dp[0][i]=1;//由于乘法,初始化为1 
		for(int i=1;i<=n;i++){//比赛场次 
			for(int j=0;j<num;j++){//获胜队伍 
				dp[i][j]=0;//初始化 
				for(int k=0;k<num;k++){//与获胜队伍比的其他队伍 
					if((j>>(i-1))==(k>>(i-1)^1)){
						dp[i][j]+=dp[i-1][j]*dp[i-1][k]*a[j][k];
					}
				}
			}
		}
		int ans=0;
		double maxx=dp[n][0];
		for(int i=1;i<num;i++){
			if(maxx<dp[n][i]){
				maxx=dp[n][i];ans=i;
			}
		}
		cout<<ans+1<<endl;
	}
	return 0;
}

http://www.niftyadmin.cn/n/515024.html

相关文章

《C语言假期作业学习笔记》—Day05

请乘理想之马 挥鞭从此起程 路上春色正好 天上太阳正晴 ——希望疫情早日结束&#xff0c;所有美好如约而至&#xff01; Day05 一、选择题 1、如下程序的功能是&#xff08; &#xff09; #include <stdio.h> int main() { char ch[80] "123abcdEFG*&&qu…

C语言学习笔记—P24(<C语言高阶>+指针的进阶<2>+计算器(初级)+题例+图解)

目录 3. 数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 4. 数组参数、指针参数 4.1 一维数组传参 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 5. 函数指针 6. 函数指针数组 C语言项目实现计算器&#xff08;初级&#xff09;&a…

探究堆喷射(heap spray)

博客园的自动保存系统真心不咋地&#xff0c;写的差不多的文章蓝屏之后就没有了&#xff0c;醉了&#xff01; 浏览器是互联网世界最主要的软件之一&#xff0c;从IE6到IE11安全攻防在不断升级&#xff0c;防御措施的实施促使堆喷射技巧不断变化。写这篇博文想好好整理并实践一…

UVA11021 Tribles(概率dp——全概率)

LINK 题目 思路 dp[i]:dp[i]:dp[i]:第iii天全部死亡的概率 p[i]:p[i]:p[i]:生iii只这种生物的概率 推式子&#xff1a; dp[i]p[0]p[1]∗dp[i−1]p[2]∗dp[i−1]2...p[n−1]∗dp[i−1](n−1)dp[i]p[0]p[1]*dp[i-1]p[2]*dp[i-1]^2...p[n-1]*dp[i-1] ^{(n-1)}dp[i]p[0]p[1]∗dp[i…

《C语言假期作业学习笔记》—Day06

请乘理想之马 挥鞭从此起程 路上春色正好 天上太阳正晴 ——希望疫情早日结束&#xff0c;所有美好如约而至&#xff01; Day06 一、选择题 1、以下叙述中正确的是&#xff08; &#xff09; A: 只能在循环体内和switch语句体内使用break语句 B: 当break出现在循环体中的…

进程间通迅之消息队列

消息队列类型有POSLX消息队列和V系统消息队列。其中POSLX为可移植的操作系统接口。 头文件&#xff1a;#include<sys/types.h> #include<sys/ipc.h> #include<sys/msg.h> A:打开/创建消息队列 int msgget(key_t key,int msgflg) 1、key:键值&#xf…

《C语言<程序改错题练习合集(1)>》

"海压竹枝低复举&#xff0c;风吹山角晦还明。” ——宋陈与义《观雨》 目录 T1&#xff1a; 题目&#xff1a; 下面程序通过指针操作&#xff0c;将由八进制数字组成的字符串“77777”转换为对应的十进制形式。 T2&#xff1a; 题目&#xff1a…

做题基础~~~tips

做题小技巧&#xff08;持续更新&#xff09;1.拆分数字x&#xff08;可以很大噢&#xff09;2.关于长度&#xff1a;3.查找一个数n的全部因子&#xff1a;&#xff08;或者是因子的个数&#xff09;4.找出一定范围x的素数方法一&#xff1a;埃氏筛法方法二&#xff1a;欧拉筛法…