E - Football(期望dp+二进制)
发布日期:2021-06-30 10:30:53
浏览次数:2
分类:技术文章
本文共 1258 字,大约阅读时间需要 4 分钟。
2 n 2^n 2n支球队,进行 n n n场比赛
对于每场比赛,存活下来的队伍按照编号递增的顺序站成一排
第一支队伍和第二支打,第三支队伍和第四支队伍打…一此类推
n n n场比赛后只有一个队伍会取胜,你只需要输出最可能获得胜利的那支队伍即可。
定义 f [ i ] [ j ] f[i][j] f[i][j]表示第 i i i轮第 j j j个人存活下来的概率
设 j j j在这一轮可能和 x 1 , x 2 . . . x k x_1,x_2...x_k x1,x2...xk打
f [ i ] [ j ] = 1 k ∗ ∑ l = 1 k f [ x l ] [ j − 1 ] f[i][j]=\frac{1}k{}*\sum\limits_{l=1}^{k}f[x_l][j-1] f[i][j]=k1∗l=1∑kf[xl][j−1]
但是这一轮,第 j j j个人要和哪些队伍打…
↗ ↖ * * ↗ ↖ ↗↖ * * * * ↗↖ ↗↖ ↗↖ ↗↖ 0 1 2 3 4 5 6 7
第 i i i轮第 j j j个人决斗的目标
110 111
就是从下往上第 i + 1 i+1 i+1层的根节点另一侧的所有节点
所以我们只需要判断每个节点在左侧还是右侧即可
所以把节点编号左移 i − 1 i-1 i−1位,那么第 i i i位的二进制 0 / 1 0/1 0/1代表左右侧
除了这一位,其他位都需要相等
#include#include #include using namespace std;const int maxn = 1009;int n;double f[maxn][maxn],p[maxn][maxn];int main(){ while( cin >> n&&n!=-1 ) { int mx = (1< > p[i][j]; for(int i=0;i >(i-1))^1)==(k>>(i-1)) ) f[i][j] += f[i-1][j]*f[i-1][k]*p[j][k]; } } double maxx = f[n][0]; int index = 0; for(int i=1;i maxx ) maxx = f[n][i],index = i; cout << index+1 << endl; }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/114871649 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月14日 16时19分20秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
UVA-11538 Chess Queen(数学)
2019-04-30
UVA-11401 Triangle Counting(数学优化)
2019-04-30
UVA 11806 Cheerleaders(容斥原理)(组合数)
2019-04-30
Codeforces Round #369 (Div. 2)
2019-04-30
UVA 11426 GCD - Extreme (II)(欧拉函数)
2019-04-30
HDU-2838 Cow Sorting(树状数组)
2019-04-30
POJ-2299 Ultra-QuickSort(树状数组)(离散化)
2019-04-30
POJ-1655 Balancing Act(树的重心)
2019-04-30
POJ-3140 Contestants Division(树dp)
2019-04-30
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 C. Sum
2019-04-30
HDU-6214 Smallest Minimum Cut(最大流)
2019-04-30
Windows安装Scrapy库
2019-04-30
基于SSM的兼职论坛系统的设计与实现
2019-04-30
基于java的图书管理系统的设计与实现
2019-04-30
基于java的SSM框架理财管理系统的设计与实现
2019-04-30