POJ 3071 Football(概率问题)
来源:互联网 发布:网络台球游戏下载 编辑:程序博客网 时间:2024/06/16 21:30
转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove
题目:有2^n个队,相邻的两两打淘汰赛,,求最后哪个队夺冠的概率最大
http://poj.org/problem?id=3071
dp[i][j]表示第i轮的时候,第j去支队伍赢的概率。
那么dp[i][j]的前提就是i-1轮的时候,j是赢的,而且第i轮赢了对方
接下来就是找到第i轮的时候,他的可能队手
通过二进制可以发现规律,所有高位是一样的,第i位刚好相反,所以用位运算可以巧妙解决,见代码
dp[i][j]=sigma(dp[i-1][j]*dp[i-1][k]*p[j][k])
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define eps 1e-10#define N (1<<7)+5#define inf 1<<20#define zero(a) (fabs(a)<eps)#define lson (step<<1)#define rson (step<<1|1)using namespace std;double p[N][N];double dp[10][N];int main(){ int n; while(scanf("%d",&n)!=EOF&&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=0; int idx=-1; for(int i=0;i<(1<<n);i++) if(dp[n][i]>ans){ ans=dp[n][i]; idx=i+1; } printf("%d\n",idx); } return 0;}
- POJ 3071 Football(概率问题)
- poj 3071 Football 概率dp
- POJ 3071 Football 概率DP
- poj 3071 football 概率dp
- poj-3071-Football-概率模拟
- poj 3071 Football(概率dp)
- POJ 3071 Football (概率DP)
- poj 3071 Football 概率dp
- Football - POJ 3071 概率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)
- POJ 3071 Football 【概率DP】
- POJ 3071 Football(概率DP)
- POJ 3071 Football [概率DP]
- 关于J2EE程序servlet中中文乱码问题,jsp页面编码格式的选择
- 关于软件开发过程中的版本兼容问题
- linux常用命令
- mysql:substr() 取出字符串中的某个特定位置的字符
- HDU 1241 Can you find it? (二分查找)
- POJ 3071 Football(概率问题)
- java 字符串解析操作
- S5PV210 FIMC capture S_FMT G_FMT处理方式
- Linux C 多线程执行顺序问题
- 推荐一些好的图书
- 没有权限: 'CreateObject'解决方法(ASP)
- eclipse出现的各种问题
- swing获取屏幕大小 不含属性栏
- HDU 1058 Humble Numbers