poj 3071 Football (概率 dp)
来源:互联网 发布:防网络尖兵 编辑:程序博客网 时间:2024/05/19 18:42
链接: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位开始所有高位是一样的,可以利用位运算判断是否为对手
状态方程为:
dp[i][j]=sigma(dp[i-1][j]*dp[i-1][k]*p[j][k])
#include<stdio.h>#include<string.h>int main(){ double p[150][150],dp[150][150]; int n,i,j,k; while(scanf("%d",&n)!=EOF){ if(n==-1) break; int m=1<<n; for(i=1;i<=m;i++) for(j=1;j<=m;j++) scanf("%lf",&p[i][j]); memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++) dp[0][i]=1.0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(k=1;k<=m;k++) if(((j-1)>>(i-1)^1)==((k-1)>>(i-1))) //判断是否为对手 dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k]; double max_p=0; int ans=0; for(i=1;i<=m;i++) if(dp[n][i]>max_p){ max_p=dp[n][i]; ans=i; } printf("%d\n",ans); } return 0;}
0 0
- 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 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)
- POJ 3071 Football (概率dp)
- FDD牌照电信日有望发放 运营商4G较量真正拉开
- 并发编程5-同步器
- 好记性不如烂笔头4-JAVA生成PDF文件
- C基本的读写操作
- js根据tab点击链接到不同页面
- poj 3071 Football (概率 dp)
- cocos2d-x 3.3的ScrollView在android模拟器中的白底蓝底问题
- 三星为小米们敲响了警钟:光硬不行,要做生态
- sql 表字段增加删除
- 好记性不如烂笔头5-JAVA快速文件拷贝
- Daddy, I found it!, 15 Awesome Linux Find Command Examples (Part2)
- EditText中光标、输入法用法
- java编程书籍排行
- oracle to_date