POJ 3071 Football(简单 概率DP)
来源:互联网 发布:如何撰写数据分析报告 编辑:程序博客网 时间:2024/05/07 05:11
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 支队伍赢的概率。、
对于其中位运算,可以用一个二叉树来更直观的理解 (j>>(i-1))^1) 跟 (k>>(i-1)分别表示一个父节点的两个子节点, 当(j>>(i-1))^1) == (k>>(i-1)时,表明两个子节点是竞争关系,胜利者将更新到复接点。
#include <stdio.h>#include <string.h>int n;double p[1000][1000];double dp[10][1000];int main(){ while(~scanf("%d", &n) && n != -1){ for(int i = 0; i < (1<<n); ++i){ for(int j = 0; j < (1<<n); ++j){ scanf("%lf", &p[i][j]); } } memset(dp, 0, sizeof(dp)); for(int i = 0; i < (1<<n); ++i){ dp[0][i] = 1; } for(int i = 1; i <= n; ++i){ for(int j = 0; j < (1<<n); ++j){ for(int k = 0; k < (1<<n); ++k){ if(((j>>(i-1))^1) == (k>>(i-1))) dp[i][j] += dp[i-1][k]*dp[i-1][j]*p[j][k]; } } } double ans = -1; int Ans = -1; for(int i = 0; i < (1<<n); ++i){ if(dp[n][i] > ans){ ans = dp[n][i]; Ans = i; } } printf("%d\n", Ans+1); } return 0;}
0 0
- POJ 3071 Football(简单 概率DP)
- (简单) 树形dp+概率 POJ 3071 Football
- POJ 3071 Football (概率DP)
- poj 3071 Football(概率dp)
- poj 3071 Football(概率dp)
- [ACM] POJ 3071 Football (概率DP)
- POJ 3071-Football(概率dp)
- poj 3071 Football (概率DP)
- POJ 3071 Football (概率dp)
- poj 3071 Football(概率dp)
- poj 3071 Football (概率 dp)
- poj 3071Football(概率dp)
- POJ 3071 Football(概率dp)
- POJ 3071 Football (概率DP)
- POJ 3071 Football(概率DP)
- POJ 3071 Football (概率DP)
- POJ-3071 Football (概率DP)
- POJ 3071 Football(概率dp)
- 基于SDL的SDL_mixer库的音乐播放器
- error: ‘for’ loop initial declarations are only allowed in
- hdu-1261
- JAVA编译过程
- 回复是对付对付对付多个发个
- POJ 3071 Football(简单 概率DP)
- c++11 Lambda函数与表示式
- spark 读取hadoop 格式的文件
- 拖动条SeekBar的简单使用
- 排序算法(Java)----基本算法
- Android4.2.2下Stagefright下OMX编解码器组件的控制流
- 大数的处理
- Spring2.5中annotation配置中@Override、@Component、 @Controller、 @Service、 @Repository、@Autowired的解析
- hdu-oj 1236 排名